进程(process)通常可被归为父进程和子进程。
父进程负责创建和结束子进程。子进程调用exit()并不能立即结束,会发SIGCHLD信号给父进程,以便父进程对资源进行回收。
在子进程结束前,如果父进程已经结束,那也没有问题。你的子进程就变成了孤儿进程或者守护进程。系统init进程会充当父进程的角色对子进程进行管理和回收。
父进程可以采用wait或waitpid等待已结束的子进程退出。如果父进程没有调用wait或waitpid来等待子进程退出。而且父进程一直运行,就会产生僵尸进程。这就是一个应该被避免的问题。
通常父进程可以采用signal的方式来等待和回收子进程结束。示例如下:
void
sig_chld(int signo)
{
pid_t pid;
int stat;
while ( (pid = waitpid(-1, &stat, WNOHANG)) > 0)
printf("child %d terminated\n", pid);
return;
}
int main()
{
Signal(SIGCHLD,sig_chld);
....
if((child = fork()) == 0)
{
}
else
{
}
....
}