文章目錄
- 一、行程等待
- 二、程式替換
一、行程等待
所謂的行程等待就是父行程等待子行程退出,父行程等待子行程退出其目的就是:
- 獲取子行程的退出回傳值
- 釋放子行程的資源,避免產生僵尸行程,(僵尸行程會造成記憶體泄露)
行程等待有2種方式,下面分別介紹:
- pid_t wait(int* status);
等待任意一個子行程退出(只要有子行程,就會處理),
引數串列:status(指標):獲取子行程退出回傳值,
回傳值: pid_t分為2種情況:
(1)如果成功,回傳子行程的pid
(2)如果失敗,回傳-1
wait介面是一個阻塞函式,所謂的阻塞就是為了完成一個功能,發起呼叫,若當前不具備完成條件,則一直等待,(就好比你去幼兒園接你娃,你沒有接到你的娃,你就會一直等著(總不可能你等一會直接回家了)),
- pid_t waitpid(pid_t pid,int* status, int options);
可以等待任意一個子行程退出,也可以等待一個指定的子行程退出,可以默認位阻塞介面,也可以默認為非阻塞介面,
所謂的非阻塞就是為了完成一個功能,發起呼叫,若當前不具備完成條件,則報錯回傳,
引數串列:
- pid_t pid:當pid = -1的時候,表示等待任意一個子行程;當pid > 0的時候,表示等待指定的子行程,
- status:獲取子行程的退出回傳值,這個status指標包含了退出回傳值(高8位)、core dump檔案(1位)、例外信號值(低7位);
Notes:對于例外信號值來說,當例外信號值為0,表示行程正常退出,若不為0表示行程例外退出,
如何獲取例外退出信號值,有兩種方法:
- (推薦) 使用系統呼叫介面:WIFEXITED(status) / WEXITEDSTATUS(status)
- 邏輯運算和移位操作:status & 0x7f / (status>>8)&0xff
Notes:core dump檔案在程式例外退出的時候,保存行程的資訊和資料,方便后期的gdb,
- options:0表示默認阻塞等待;用WHOHANG可以設定為非阻塞,
回傳值pid_t:
當回傳值大于0時,表示退出子行程的pid,當回傳值等于0時候,表示沒有子行程退出,錯誤回傳-1,
下面我們來看看這兩個介面的代碼操作:


Notes:這里直接將waitpid第三個引數設定為WNOHANG,如果options = 0的話其實和wait沒什么區別,
上面這個代碼運行后還會產生僵尸行程

是因為waitpid等待了任意一個子行程后直接處理了,后面的子行程得不到處理,就成為僵尸行程了,為了避免這種情況,給waitpid加一個回圈即可:

status的獲取:

此處獲取子行程退出回傳值成功后status的值為99(我不小心把結果整沒了,,,有一絲尷尬),
二、程式替換
行程替換就是替換一個行程正在調度運行的程式,加載一個新的程式到內容中,更新當前行程的頁表映射資訊,讓當前行程映射到程式上,

exec函式簇:

第一個引數:新的程式檔案路徑名字
第二個引數:程式的運行引數
第三個引數:程式的環境變數
舉個例子:


我們可以看到上面代碼執行結果并沒有列印"linux真tm難"是因為執行execl替換以后就執行ls命令,執行完畢后就直接退出,所以沒有列印"linux真tm難"
函式簇中,execl和execlp的區別就在于程式檔案是否需要路徑,有p的時候,可以不用帶路徑,但是有一個限制就是程式必須在PATH環境變數指定的路徑下,

execle和execl的區別就在于:
程式是否自己設定環境變數,有e就是自己設定(覆寫式),沒有e就是用默認的路徑,




我們可以看到當使用execle時,環境變數就剩一個了,就是我們自己設定的,
execl和execv的區別就在:
程式運行引數的賦予方式不一樣,v是傳字串指標陣列,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/271500.html
標籤:其他
上一篇:Nginx網頁與安全優化
下一篇:行程創建-終止-等待-替換
