Linux學習筆記12 wait

2021-09-12 07:37:09 字數 2346 閱讀 7747

僵死程序(其實就是zombie,殭屍):乙個程序已經終止了,但是它的父程序又還沒有對他進行善後(比如通過wait獲取該子程序的終止狀態,釋放子程序占用的資源),那麼這個已死的程序就叫僵死程序。話說這個都是老子替兒子善後啊,白髮人送黑髮人。。。。。

收養:如果乙個程序還沒終止,但是它的父程序已經終止了,這時候他就成孤兒了。那這個程序終止後豈不無人善後,一定變殭屍??所以系統會自動的讓init程序(pid=1)收養這個孤兒,以保證每乙個程序都有父程序,不會死後變殭屍。

退出狀態:exit()的輸入引數或者return後面跟的數字,就是退出狀態。

終止狀態:exit函式會呼叫_exit()系統呼叫,在這裡退出狀態會變成終止狀態。後面會介紹乙個巨集定義wexitstatus,其可以通過終止狀態恢復出退出狀態。

#includepid_t wait(int* statloc)
成功,返回子程序的pid;失敗,返回0.

函式執行的效果:避免殭屍產生

這個函式在父程序中執行,一直等待其子程序退出。有任意乙個子程序退出,wait就返回子程序的pid。並且,如果輸入引數statloc不為空指標,則其能獲得子程序的終止狀態。注意,終止狀態並不等於exit的輸入引數(退出狀態)。終止狀態含有退出狀態的資訊。如果在wait執行前已經有子程序退出了,則wait不用等待,馬上獲取到該子程序的退出狀態並返回。如果一直沒有子程序退出,則wait就一直等待,阻塞。

乙個典型的使用方法是這樣的:

if (wait(&status) != pid)
我們用wait可以獲取到子程序終止時的終止狀態status。可是status只是乙個int。怎麼通過這個int來獲取資訊呢?

有幾個以wif(我懷疑是wait if的意思。。。)開頭的巨集定義可用。它們和wait函式在同乙個標頭檔案下。

wifexited(status)  , 如果子程序是正常終止,則返回true。這種情況下可以通過wexitstatus(status)獲取退出狀態

wifsignaled(status),如果子程序異常退出,例如abort退出或分母為0等等,則其為true。此時,可以通過wtermsig(status)獲取子程序終止的訊號編號。同時,有些系統裡定義了wcoredump,可以用來確定這個異常退出有沒有產生coredump檔案。 用法就是wcoredump(status),為true就是產生了。

stop什麼的現在不懂,以後再說吧。

//獲取終止狀態的資訊,並列印

void pre_exit(int status)

else if (wifsignaled(status)) //異常退出,包括abort()或其他

else if(wifstopped(status)) //stop?? }

int main(void) else if (pid == 0)

//用wait獲取子程序的退出狀態,獲取不到就阻塞,一直等著

//如果子程序已經終止了,那它馬上就能獲取到,馬上返回

//返回值為子程序的pid

if (wait(&status) != pid)

pre_exit(status);

// 2, abort

if((pid = fork()) < 0 ) else if (pid == 0)

if (wait(&status) != pid)

pre_exit(status);

//3, 分母為0

if((pid = fork()) < 0 ) else if (pid == 0)

if (wait(&status) != pid)

pre_exit(status);

//父程序退出

exit(0);

}

執行效果是:

➜  code ./study_linux                                       

pre_exit, status = 1792

normal termination, exit status = 7

pre_exit, status = 134

abnormal termination, signal number = 6  (core file generated)

pre_exit, status = 136

abnormal termination, signal number = 8  (core file generated)

可以看到,

第一次,正常退出,退出狀態就是我們傳遞給exit的引數7。

第二次,abort退出,會發出sigabrt訊號,也就是6;

第三次,分母為0,crash,訊號為8

linux程序學習,使用wait函式

include include include include include include int main else if pc 0 子程序 else 父程序 else 如果wifexited返回零 exit 0 注意 1.wait函式的使用時如果需要知道退出時候的返回值,呼叫wait函式的時...

學習筆記12

sql server提供了兩種索引 聚集索引和非聚集索引。其中聚集索引表示表中儲存的資料按照索引的順序儲存,檢索效率比非聚集索引高,但對資料更新影響較大。非聚集索引表示資料儲存 在乙個地方,索引儲存在另乙個地方,索引帶有指標指向資料的儲存位置,非聚集索引檢索效率比聚集索引低,但對資料更新影響較小。聚...

學習筆記 父程序wait和waitpid

1 wait和waitpid出現的原因 sigchld q 當子程序退出的時候,核心會向父程序傳送sigchld訊號,子程序的退出是個非同步事件 子程序可以在父程序執行的任何時刻終止 q 子程序退出時,核心將子程序置為殭屍狀態,這個程序稱為殭屍程序,它只保留最小的一些核心資料結構,以便父程序查詢子程...