1. 程式人生 > 實用技巧 >linux 程序領養以及殭屍程序

linux 程序領養以及殭屍程序

父程序子程序結束不同步發生的問題:孤兒程序和殭屍程序

當父程序和子程序退出不同步的時候,會發生兩種情況

1.父程序先退出,子程序未退出,被領養

此時,子程序將被init初始程序領養。如下面的程式碼:

a.c

#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
int main(){
	pid_t pid = fork();
	if(pid>0){
		printf("parent pid is:%d ,child pid is:%d", getpid(),pid);
		
	}else{
		while(1) sleep(1);
		printf("child died");
	}
	return 0;
}

輸出:parent pid is:2927 ,child pid is:2928

ps -aux檢視該程序狀態

lsx 2928 0.0 0.0 2356 76 pts/0 S 11:38 0:00 ./a

此時只有一個./a程序,父程序已經退出 子程序依舊在執行,且執行狀態為S,斌不是殭屍程序。

2.子程序先退出,父程序依舊執行,則子程序變為殭屍程序

#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
int main(){
	pid_t pid = fork();
	if(pid>0){
		printf("parent pid is:%d ,child pid is:%d", getpid(),pid);
		while(1) sleep(1);
	}else{
		printf("child died");
		exist(0);
	}
	return 0;
}

輸出結果是:

parent pid is:1784 ,child pid is:1785
child died

使用ps -aux檢視程序

lsx         1784  0.0  0.0   2488   516 pts/0    S+   12:45   0:00 ./a     父程序依舊執行
lsx         1785  0.0  0.0      0     0 pts/0    Z+   12:45   0:00 [a] <defunct> 子程序為殭屍程序z+ <defunct>

避免殭屍程序
讓殭屍程序的父程序來回收,父程序每隔一段時間來查詢子程序是否結束並回收,呼叫wait()或者waitpid(),通知核心釋放殭屍程序。採用訊號SIGCHLD通知處理,並在訊號處理程式中呼叫wait函式。讓殭屍程序成為孤兒程序,由init程序回收。