道描述符,向被执行命令读或写数据(做为被执行命令的STDIN或 STDOUT)该系统调用可以用来在程序中调用系统命令,并取得命令 的输出信息或者向命令输入信息.
返回值:不成功则返回NULL,成功则返回管道的文件指针.
2.5.pclose() 关闭到一个进程的管道
功能:关闭到一个进程的管道. 语法:
#include
说明:本系统调用用于关闭由popen()打开的管道,并会等待由popen() 激活的命令执行结束后,关闭管道后读取命令返回码.
返回值:若关闭的文件描述符不是由popen()打开的,则返回-1. 例子:printf(\ FILE * fd;
if ((fd=popen(\ printf(\ return; }
else {
char str[80];
while (fgets(str,80,fd)!=NULL) printf(\ } pclose(fd);
2.6.wait() 等待一个子进程返回并修改状态
功能:等待一个子进程返回并修改状态 语法:
#include
说明:允许调用进程取得子进程的状态信息.调用进程将会挂起直到其 一个子进程终止.
返回值:等待到一个子进程返回时,返回值为该子进程号,否则返回值为 -1.同时stat_loc返回子进程的返回值. 例子:/*父进程*/ if (fork()>0) { wait((int *)0);
/*父进程等待子进程的返回*/ } else {
/*子进程处理过程*/ exit(0); }
2.7.waitpid() 等待指定进程号的子进程的返回并修改状态
功能:等待指定进程号的子进程的返回并修改状态 语法:
#include
pid_t waitpid(pid,stat_loc,options) pid_t pid;
int *stat_loc,options;
说明:当pid等于-1,options等于0时,该系统调用等同于wait().否则该 系统调用的行为由参数pid和options决定.
pid指定了一组父进程要求知道其状态的子进程: -1:要求知道任何一个子进程的返回状态.
>0:要求知道进程号为pid值的子进程的状态.
<-1:要求知道进程组号为pid的绝对值的子进程的状态. options参数为以比特方式表示的标志以或运算组成的位图,每个 标志以字节中某个比特置1表示:
WUNTRACED:报告任何未知而又已停止运行的指定进程号的子进 程的状态.该子进程的状态自停止运行时起就没有被报告 过. WCONTINUED:报告任何继续运行的指定进程号的子进程的状态, 该子进程的状态自继续运行起就没有被报告过.
WHOHANG:若调用本系统调用时,指定进程号的子进程的状态目 前并不是立即有效的(即可被立即读取的),调用进程并被 暂停执行. WNOWAIT:保持将其状态设置在stat_loc的进程在可等待状态.
该进程将等待直到下次被要求其返回状态值.
返回值:等待到一个子进程返回时,返回值为该子进程号,否则返回值为 1. 同时stat_loc返回子进程的返回值. 例子:pid_t pid;
int stat_loc; /*父进程*/ if ((pid=\
waitpid(pid,&stat_loc,0);
/*父进程等待进程号为pid的子进程的返回*/ } else {
/*子进程的处理过程*/
exit(1); }
/*父进程*/
printf(\
/*字符串\将被打印出来*/
2.8.setpgrp() 设置进程组号和会话号
功能:设置进程组号和会话号. 语法:
#include
说明:若调用进程不是会话首进程.将进程组号和会话号都设置为与它 的进程号相等.并释放调用进程的控制终端. 返回值:调用成功后,返回新的进程组号. 例子:/*父进程处理*/ if (fork()>0) { /*父进程处理*/ } else {
setpgrp();
/*子进程的进程组号已修改成与它的进程号相同*/ exit(0); }
2.9.exit() 终止进程
功能:终止进程. 语法:
#include
说明:调用进程被该系统调用终止.引起附加的处理在进程被终止前全 部结束. 返回值:无
2.10.signal() 信号管理功能
功能:信号管理功能 语法:
#include
void (*signal(sig,disp))(int)
int sig;
void (*disp)(int);
void (*sigset(sig,disp))(int) int sig;
void (*disp)(int);
int sighold(sig) int sig;
int sigrelse(sig) int sig;
int sigignore(sig) int sig;
int sigpause(sig) int sig;
说明:这些系统调用提供了应用程序对指定信号的简单的信号处理. signal()和sigset()用于修改信号定位.参数sig指定信号(除了
SIGKILL和SIGSTOP,这两种信号由系统处理,用户程序不能捕捉到). disp指定新的信号定位,即新的信号处理函数指针.可以为 SIG_IGN,SIG_DFL或信号句柄地址.
若使用signal(),disp是信号句柄地址,sig不能为SIGILL,SIGTRAP
或SIGPWR,收到该信号时,系统首先将重置sig的信号句柄为SIG_DFL, 然后执行信号句柄.
若使用sigset(),disp是信号句柄地址,该信号时,系统首先将该 信号加入调用进程的信号掩码中,然后执行信号句柄.当信号句柄 运行结束
后,系统将恢复调用进程的信号掩码为信号收到前的状态.另外, 使用sigset()时,disp为SIG_HOLD,则该信号将会加入调用进程的 信号掩码中而信号的定位不变.
sighold()将信号加入调用进程的信号掩码中. sigrelse()将信号从调用进程的信号掩码中删除.
sigignore()将信号的定位设置为SIG_IGN.
sigpause()将信号从调用进程的信号掩码中删除,同时挂起调用 进程直到收到信号.
若信号SIGCHLD的信号定位为SIG_IGN,则调用进程的子进程在终 止时不会变成僵死进程.调用进程也不用等待子进程返回并做相 应处理.
返回值:调用成功则signal()返回最近调用signal()设置的disp的值. 否则返回SIG_ERR.
例子一:设置用户自己的信号中断处理函数,以SIGINT信号为例: int flag=0;
void myself()
{
flag=1;
printf(\
/*若要重新设置SIGINT信号中断处理函数为本函数则执行以 *下步骤*/ void (*a)(); a=myself;
signal(SIGINT,a); flag=2; }
main()
{
while (1) {
sleep(2000); /*等待中断信号*/ if (flag==1) {
printf(\ exit(0); }
if (flag==2) {
printf(\ printf(\ } } }
2.11.kill() 向一个或一组进程发送一个信号
功能:向一个或一组进程发送一个信号. 语法:
#include
说明:本系统调用向一个或一组进程发送一个信号,该信号由参数sig指 定,为系统给出的信号表中的一个.若为0(空信号)则检查错误但 实际上并没有发送信号,用于检查pid的有效性.
pid指定将要被发送信号的进程或进程组.pid若大于0,则信号将 被发送到进程号等于pid的进程;若pid等于0则信号将被发送到所 有的与发送信号进程同在一个进程组的进程(系统的特殊进程除 外);若pid小于-1,则信号将被发送到所有进程组号与pid绝对值 相同的进程;若pid等于-1,则信号将被发送到所有的进程(特殊系 统进程除外).