這又得說到殭屍程序了
總結的來說,就是子程序退出,但是讓子程序幫忙做事的父程序一直不檢視子程序做事的結果,所以子程序進入殭屍狀態,我們可以通過殺死父程序來退出此狀態(但是很暴力),所以我們可以採取讓父程序等待,讓他記得要**子程序資源,獲取子程序的退出資訊。
1、wait()方法
2、waitpid()方法成功返回的是被等待程序的pid,失敗返回-1#include#includepid_t waitz(int* status);
引數是輸出型引數,獲取子程序的狀態,不關心狀態時可以設定成null
pid_t waitpid(pid_t pid,int * status,int options);具體思路:正常返回子程序的id
引數pid:pid==-1,等待任意子程序,和wait一樣
pid>0:等待其程序id與pid相等的子程序
status:
wifexited(status):如果是正常終止子程序返回的狀態,則為真
wexitstatus(status):如果wifexited非零,提取子程序退出碼
分析:兩種方法都需要獲取子程序status來作為返回值,如何獲取返回值??
status引數是由作業系統填充的,如果傳遞null,表示不關心狀態,否則,作業系統會根據該引數將子程序的退出資訊反饋給父程序。要將status看做成位圖。
父程序只能等待乙個程序,如果wait與子程序個數不匹配,那麼有的子程序就會陷入殭屍程序
1
#include
2#include
3#include45
#include
6int main()
15 //父程序
16 id=fork();
17if(id==0)
23wait(null);
24 // wait(null);
25 // printf("father do other thing");//只有乙個wait()時就會有殭屍程序產生
26while(1)
30 }
2、waitpid()方法
pid_t waipid(pid_t pid,int* status,int options);阻塞式等待:(父程序在等子程序子程序一天不結束父程序就無法往下執行)返回值:
正常返回返回的是子程序的id
引數pid:
pid==-1,等待任意子程序,和wait一樣
pid>0:等待其程序id與pid相等的子程序status:
status:
wifexited(status):如果是正常終止子程序返回的狀態,則為真檢視程序是否正常退出
wexitstatus(status):如果wifexited非零,提取子程序退出碼檢視退出碼
options:
wnohang:如果pid指定子程序沒有結束,則waitpid()返回0,不再等待,正常結束則返回子程序的id.
1
#include
2#include
3#include
4#include
5#include
6int main(void)
12else
if(pid==0)
18elseelse
29 }
30return
0; 31 }
非阻塞時等待:
#include
2#include
3#include
4#include
5int main()
11else
if(pid==0)
16else
25 sleep(1);
26 }while(ret==0);//只要有子程序沒有結束就要一次次進去檢視狀態
解決殭屍程序
linux下的殭屍程序,用kill 9 都不會消失,下面有一種辦法可以解決此問題 前些天發現有crontask程序死掉了,狀態為z,表明是殭屍程序了。通過下面的步驟可以解決它 1.用pstree命令查詢其父程序 5124 ss 0 00 crond 8884 s 0 00 crond 8893 zs...
解決殭屍程序
這幾天同事寫的程式中出現了大量的殭屍程序,幫忙分析了一下,問題出現在幾個方面 首先top命令檢視殭屍程序數目 檢視所有的殭屍程序 殺死所有殭屍程序 ps a o stat,ppid,pid,cmd grep e zz awk xargs kill 9 在程式中幾個注意的方面 1.建立子程序後,父程序...
subprocess解決殭屍程序
由於父程序建立子程序是非同步的,雙方不知道各自的執行狀態,而父程序有的時候需要知道子程序退出時的一些資訊,所以 linux提供了一種機制,通過讓子程序退出時向父程序傳送 sigchrd 訊號來告知父程序,子程序已經退出了。同時,父程序通過呼叫 wait 和 waitpid 來獲取子程序的退出資訊。i...