孤兒進程和殭屍進程

孤兒進程:一個父進程退出,而它的一個或多個子進程還在運行,那麼那些子進程將成爲孤兒進程。孤兒進程將被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進程可以處理殭屍進程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章