Linux 程序控制之程序等待的理解和使用

2021-10-24 14:58:50 字數 2798 閱讀 4288

程序等待:父程序等待子程序退出,獲取子程序退出返回值,釋放子程序資源,避免產生殭屍程序。

子程序退出,若父程序沒有關注子程序的退出狀態,就會造成殭屍程序,會有記憶體洩漏的風險。

子程序是為了完成任務,任務完成的怎麼樣,需要父程序判斷。

程序等待的方法:

#include #include pid_t wait(int *status);

pid_t waitpid(pid_t pid,int *status, int options);

處理退出的子程序,若沒有子程序退出,使父程序阻塞等待,直到有子程序退出。例:

#include #include #include #include int main()

else if (ret > 0)

else

return 0;

}

在父程序休眠10s的時候,檢視子程序狀態:ps -aux | grep wait

此時,子程序成為了殭屍程序。

程式的輸出為:

為什麼子程序的退出狀態是256,而不是1呢?

通過wait介面獲取的子程序退出返回值,返回值只使用了乙個位元組進行儲存,並且返回的時候,並沒有儲存在status的低位,而是儲存在了低16位中的高8位

即:

程式正常退出才有意義。

在程式正常退出的時候,其低8位都是0。

所以status的二進位制位:0x00000100。其結果就為256。

在取子程序退出返回值之前,應該先判斷低7位是否是正常退出的

返回值只用了1個位元組進行儲存,故程序返回值最好不要大於255

這是自己計算時用的方法,可以直接呼叫函式來確定是否正常退出。

wifexited檢視程序是否正常退出。正常則為真

wexitstatus:若wifexited為真,提取子程序的退出碼。檢視程序退出碼

其結果為:

wait介面,若有多個子程序,等待任意子程序退出,都會在處理退出的子程序後,呼叫返回。

pid = -1,等待任意乙個子程序

pid > 0,等待程序id與pid相等的子程序

wifexited(status):正常終止子程序,為真

wexitstatus(status):正常終止時,檢視退出碼。

options = 0,預設為阻塞,一直等到有退出的子程序,進行釋放資源,再往下執行程式

options = wnohang,設為非阻塞。

在非阻塞的情況下:必須得迴圈處理,否則一次處理不成功,就不會再等待子程序退出了。

例:

#include #include #include #include int main()

else if(ret > 0)

sleep(10);//檢視子程序是否退出

}

else

return 0;

}

其輸出結果為:

其子程序退出碼不對,則子程序的資源沒有被釋放,是乙個殭屍程序。

檢視其程序資訊:

此時子程序成為了乙個殭屍程序。

對其進行迴圈處理:

執行結果為:

此時,該程序已經被釋放了:

wait和waitpid區別:

wait是乙個阻塞介面,必須得等子程序退出,否則一直等待

waitpid可以預設阻塞,也可以設定為非阻塞,由第三個引數確定。(0:預設阻塞,wnohang:非阻塞)

waitpid可指定等待退出的子程序id返回值有所不同。wait成功返回子程序id,失敗返回-1;waitpid成功收集到子程序返回id,沒有可收集的子程序返回0,呼叫出錯返回-1。

wait和waitpid若不關心子程序退出資訊,可將status設定為null。

Linux程序控制 程序終止 程序等待

目錄 程序終止 程序中退出的方式 void exit int status 與void exit int status 的不同 程序等待 pid t wait int status void waitpid pid t,int status,int options 阻塞與非阻塞 status 判斷程...

Linux程序控制 2 程序等待 程式替換

我們知道,子程序先退出,父程序如果不管不顧,就會導致殭屍程序,進而造成資源洩漏等嚴重問題 一旦產生殭屍程序,殺人不眨眼 的kill 9也無能為力,因為沒有辦法殺死乙個已經僵死的程序 那麼如何避免產生殭屍程序呢?父程序通過程序等待的方式,子程序資源,獲取子程序退出資訊 這裡先說一下阻塞和非阻塞 阻塞 ...

Linux程序控制(建立 等待 終止)

一 linux程序建立 1.1 fork函式 在linux中fork函式是乙個非常重要的函式,它從已存在程序中建立了乙個新程序。新程序為子程序,而原程序為父程序 include pid t fork void 返回值 自程序中返回0,父程序返回子程序id,出錯返回 1 程序呼叫fork,當控制轉移到...