孤兒進程:一個父進程退出,而它的一個或多個子進程還在運行,那麼那些子進程將成爲孤兒進程。孤兒進程將被init進程即1號進程收養,並由init進程進行管理。
殭屍進城:如果子進程退出,而父進程並沒有調用wait或waitpid獲取子進程的狀態信息。這種進程稱之爲僵死進程。
我們通過代碼實現並且查看着兩個進程
孤兒進程:
#include<stdio.h>
#include<stdlib.h>
int main()
{
pid_t id=fork();
if(id>0)
{
sleep(1);
printf("father:%d,%d\n",getpid(),getppid());
}
else if(id==0)
{
sleep(6);
printf("child:%d,%d\n",getpid(),getppid());
exit(0);
}
else
{
perror("fork");
}
return 0;
}
殭屍進程:
#include<unistd.h>
#include<stdio.h>
#include <errno.h>
#include <stdlib.h>
int main()
{
pid_t pid;
pid = fork();
if (pid <0)
{
perror("fork error:");
exit(1);
}
else if (pid == 0)
{
printf("I am child process.I am exiting.[%d][%d]\n",getpid(),\
getppid());
exit(0);
}
printf("I am father process.[%d]\n",getpid());
//等待子進程先退出
sleep(2);
//輸出進程信息
system("ps -o pid,ppid,state,tty,command");
printf("father process is exiting.\n");
return 0;
}
如果進程不調用wait / waitpid的話, 那麼保留的那段信息就不會釋放,其進程號就會一直被佔用,但是系統所能使用的進程號是有限的,如果大量的產生僵死進程,將因爲沒有可用的進程號和進程資源而導致系統不能產生新的進程. 此即爲殭屍進程的危害,應當避免。
孤兒進程是沒有父進程的進程,孤兒進程這個重任就落到了init進程身上,init進程就好像是一個孤兒院,專門負責處理孤兒進程的善後工作。每當出現一個孤兒進程的時候,內核就把孤 兒進程的父進程設置爲init,而init進程會循環地wait()它的已經退出的子進程。這樣,當一個孤兒進程淒涼地結束了其生命週期的時候,init進程就會代表黨和政府出面處理它的一切善後工作。因此孤兒進程並不會有什麼危害。
4.解決方法
(1)通過信號機制
子進程退出時向父進程發送SIGCHILD信號,父進程處理SIGCHILD信號。在信號處理函數中調用wait進行處理殭屍進程。
(2)fork兩次原理是將子進程成爲孤兒進程,從而其的父進程變爲init進程,通過init進程可以處理殭屍進程。