在Linux/Unix系统中,当进程结束时,内核会释放进程占用的所有资源:占用的内存、打开的文件等,但是仍保留一些信息:进程ID、退出状态、运行时间,这些信息等着父进程来去(条用wait/waitpid),在父进程取走之前,子进程称为僵死进程。
为了防止僵死进程,父进程可以阻塞等待子进程结束,这是这样父进程就不能做自己的工作。
父进程也可以采用“轮询”的方式来调用wait/waitpid,但是这样设计程序可能会过于复杂。
子进程终止会给父进程发送SIGCHLD信号,父进程可以捕捉这个信号,在信号处理程序中条用wait/waitpid
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<signal.h>
#include<stdio.h>
/*信号处理函数*/
void sigHandler(int sig)
{
int stat;
wait(&stat);
if(WIFEXITED(stat))
printf("child process eixt code is %d\n",WEXITSTATUS(stat));
else if(WIFEXITED(stat))
printf("child process terminated abnormally, signal %d\n",WTERMSIG(stat));
}
void initSig() {
struct sigaction act;
act.sa_handler=sigHandler;//注册信号处理函数
sigemptyset(&act.sa_mask);
act.sa_flags=0;
sigaction(SIGCHLD,&act,NULL);
pause();
}
int main()
{
pid_t pid;
pid=fork();
if(pid==0){
/*child*/
sleep(5);
exit(2);
}
if(pid>0){
/*parent*/
initSig();
}
return 0;
}