linux 程序領養以及殭屍程序
阿新 • • 發佈:2020-12-24
父程序子程序結束不同步發生的問題:孤兒程序和殭屍程序
當父程序和子程序退出不同步的時候,會發生兩種情況
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程序回收。