程序等待 解決殭屍程序

2021-08-19 08:02:12 字數 2669 閱讀 1967

這又得說到殭屍程序了

總結的來說,就是子程序退出,但是讓子程序幫忙做事的父程序一直不檢視子程序做事的結果,所以子程序進入殭屍狀態,我們可以通過殺死父程序來退出此狀態(但是很暴力),所以我們可以採取讓父程序等待,讓他記得要**子程序資源,獲取子程序的退出資訊。

1、wait()方法

#include#includepid_t waitz(int* status);
成功返回的是被等待程序的pid,失敗返回-1

引數是輸出型引數,獲取子程序的狀態,不關心狀態時可以設定成null

2、waitpid()方法

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...