监视子进程
通过 SIGCHLD 信号实现异步方式监视子进程。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
static void wait_child(int sig)
{
printf("父进程回收子进程\n");
while(waitpid(-1,NULL,WNOHANG) > 0)
continue;
}
int main(void)
{
struct sigaction sig = {0};
sigemptyset(sig.sa_mask);/*信号集初始化*/
sig.sa_handler = wait_child;
sig.sa_flags = 0;
if(-1 == sigaction(SIGCHLD,&sig,NULL))
{
perror("sigaction error");
exit(-1);
}
switch (fork())
{
case -1:
perror("fork error");
exit(-1);
case 0: /*如果创建了子进程*/
printf("子进程<%d>被创建\n",getpid());
sleep(1);
printf("子进程over\n");
_exit(0);
default: /*如果已经创建了子进程则退出函数*/
break;
}
sleep(3);
exit(0);
}
运行结果: