当一个子进程结束运行(一般是调用exit、运行时发生致命错误或收到终止信号所导致)

时,子进程的退出状态(返回值)会回报给操作系统,系统则以SIGCHLD信号将子进程被结束

的事件告知父进程,此时子进程的进程控制块(PCB)仍驻留在内存中。一般来说,收到

SIGCHLD后,父进程会使用wait系统调用以取得子进程的退出状态,然后内核就可以从内存中

释放已结束的子进程的PCB;而如若父进程没有这么做的话,子进程的PCB就会一直驻留在内

存中,也即成为僵尸进程。   孤儿进程则是指父进程结束后仍在运行的子进程。在类UNIX

系统中,孤儿进程一般会被init进程所“收养”,成为init的子进程。   为避免产生僵尸

进程,实际应用中一般采取的方式是:   1.将父进程中对SIGCHLD信号的处理函数设为

SIG_IGN(忽略信号);   2.fork两次并杀死一级子进程,令二级子进程成为孤儿进程而

被init所“收养”、清理。

Logo

更多推荐