程序等待:父程序等待子程序退出,獲取子程序退出返回值,釋放子程序資源,避免產生殭屍程序。
子程序退出,若父程序沒有關注子程序的退出狀態,就會造成殭屍程序,會有記憶體洩漏的風險。
子程序是為了完成任務,任務完成的怎麼樣,需要父程序判斷。
程序等待的方法:
#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,當控制轉移到...