僵尸进程和孤儿进程是父进程不调用wait时子进程可能的两个状态。
僵尸进程:僵尸进程是指子进程结束运行(exit(0)), 系统将会保留子进程的描述符信息(没有被回收,其他进程不可以重用该描述符),而父进程没有调用wait对退出的子进程进行处理。子进程成为僵尸进程。查看命令ps打印其state可将有Z标志。
孤儿进程:父进程没有调用wait等待子进程退出。父进程结束后,子进程仍然在运行,此时子进程成为孤儿进程。孤儿进程会被init进程捕获到,并将init进程作为自己的父进程,此时所有的清除操作将会交给init进程(init进程循环调用wait)。 因此,孤儿进程是无害的。
解决僵尸进程的编程方法:首先父进程调用signal注册一个一个信号处理函数处理信号SIGCHILD: signal(SIGCHILD, call_back),call_back中调用wait_pid. 子进程在退出时会发出SIGCHILD,被父进程捕获后会调用call_back,完成对子进程描述符的回收操作,
void call_back(int signo); int main() { signal(SIGCHILD, call_back); int pid = fork(); if(pid==0) { //son thread; exit(0) } else { //father thread; //sleep(100000); }; }
来源:oschina
链接:https://my.oschina.net/u/2368952/blog/521710