5.2系統呼叫wait()
迄今為止,我們還沒做多少工作,只是建立了乙個子程序列印了點資訊就退出了。事實說明,有時候讓父程序去等待子程序結束是十分有用的。這項工作就是由wait()函式完成的(或者由waitpid()函式完成)詳見figure5.2。
在程式p2.c中,父程序通過呼叫wait()函式來延遲自身的執行直至子程序執行完成。當子程序完成,wait()函式就返回到父程序中。
在上面的程式中加入wait()函式使得程式的輸出變得確定。你知道為什麼咩?小小滴思考一下~
(進入wait過程等待您的思考……考慮完畢,程序結束)
[cpp]view plain
copy
prompt> ./p2
hello world(pid:29266)
hello, i am child(pid:29267)
hello, i am parentof 29267 (wc:29267) (pid:29266)
prompt>
根據這些**,我們現在可以知道,子程序永遠在父程序前面執行輸出操作。為什麼我們會知道咧?首先,可能子程序先執行了所以在父程序之前列印。然而,也可能碰巧父程序先執行,那麼他會立即出發wait()函式從而讓子程序開始執行直至子程序結束退出,然後才會返回到父程序中繼續執行。
因此,即使是父程序先執行,它也會禮貌的等待子程序結束後,wait()函式返回後再列印自己的輸出資訊。
5.3系統呼叫exec()函式族
最後乙個重要的程序建立的api是exec()。在你想要執行乙個程式而非呼叫程式時,這個系統呼叫非常適用。比如,在程式p2.c中呼叫fork()函式只是對你在程式執行時拷貝乙個與父程序一樣的程序有用。然而,我們更多的是想要執行乙個不同的程式,exec()函式就是幫我們完成這項工作的。
[cpp]view plain
copy
#include
#include
#include
#include
#include
intmain(
intargc,
char
*argv)
else
if(rc == 0) else
return
0;
} figure 5.3: 呼叫 fork(), wait(), 和 exec()函式 (p3.c)
在例子5.3中,子程序呼叫了execvp()來執行程序統計物件wc。實際p3.c原始檔執行wc來統計告知我們檔案有多少行,多少單詞和位元組。
[cpp]view plain
copy
prompt> ./p3
hello world(pid:29383)
hello, i am child(pid:29384)
29 107 1030 p3.c
hello, i am parentof 29384 (wc:29384) (pid:29383)
prompt>
這裡的fork()函式很奇怪,同樣exec()函式也不正常。它做的事情是:在給了執行物件(wc)和引數(p3.c)的情況下,載入可執行程式中的**並用來覆蓋當前的**段,記憶體空間的堆疊以及其他部分都重新初始化。然後作業系統開始執行這個程式,並按照argv那樣傳遞程序的引數。因此,它並沒有建立乙個新的程序,實際上,他只是將當前執行的程序(p3)轉換到另乙個不同的執行中的程序(wc).當子程序的exec()函式執行完成後,整個程式看起來好像p3從沒執行過。乙個成功的exec()呼叫從來不會返回。
wait系統呼叫
高階linux程式設計.pdf page46 wait系統呼叫 巨集wifexited和wexitstatus的定義一般在 usr include sys wait.h include include include include include include 包含對巨集wifexited和we...
linux中wait系統呼叫
系統中的殭屍程序都要由wait系統呼叫來 下面就通過實戰看一看wait的具體用法 wait的函式原型是 include 提供型別pid t的定義 include pid t wait int status 程序一旦呼叫了wait,就立即阻塞自己,由wait自動分析是否當前程序的某個子程序已經 退出,...
Linux中的wait系統呼叫
系統中的殭屍程序都要由wait系統呼叫來 下面就通過實戰看一看wait的具體用法 wait的函式原型是 include 提供型別pid t的定義 include pid t wait int status 程序一旦呼叫了wait,就立即阻塞自己,由wait自動分析是否當前程序的某個子程序已經退出,如...