行程終止:簡單來說就是如何退出一個行程
- 在main函式中可以直接采用return退出(在普通函式中return只能退出函式而不能退出行程)
- 在函式任意位置呼叫 ==viod exit(int status); ==
其中,exit是庫函式,在退出行程時會重繪緩沖區,將緩沖區中的資料寫入檔案,status為行程退出的回傳值, - 在函式任意位置呼叫 _exit(int status);
值得注意的是,_exit是系統呼叫介面,使用_exit退出行程時會直接釋放資源,不會重繪緩沖區,
行程等待:父行程等待子行程退出,獲取子行程的回傳值,釋放子行程的資源
-
int wait(int *status);
用于處理退出的子行程,若呼叫時沒有子行程退出,則使父行程阻塞,直到有子行程退出,使用時要添加頭檔案#include<sys/wait.h>,若成功則回傳退出子行程的pid大于0,若失敗則回傳-1,其中status為輸出型引數,用于獲取退出子行程的回傳值, -
int waitpid(int pid,int *status,int option);
此方法可以用于等待指定的子行程,也可以等待任意一個子行程,通過第一個引數來確定,若pid = -1則表示等待任意子行程,pid = x則表示等待第x個子行程,同時還可以通過第三個引數來設定是否使父行程阻塞,若option = 0 則默認阻塞,option = WNOHANG則默認非阻塞,,若成功則回傳退出子行程的pid大于0,沒有子行程退出回傳0,出錯回傳-1,
孤兒行程:父行程先于子行程退出,子行程就會變成孤兒行程,被一號行程(init行程)收養,并由一號行程對它們完成狀態收集作業,不會產生危害,
僵尸行程:子行程先于父行程退出,父行程沒有關注子行程狀態,導致子行程資源無法完全釋放,產生資源泄漏,
在面對行程終止問題時,我們只有使之變成孤兒行程和僵尸行程兩種選擇,而其中的僵尸行程會造成資源泄漏的問題,那么應該如何解決這個問題?這個時候就要用到行程等待,讓父行程等待子行程的退出,及時釋放退出的子行程的資源,避免資源泄漏的產生,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/266760.html
標籤:其他
上一篇:go語言學習—go語言原始碼檔案
