系統呼叫wait

2021-08-17 03:34:23 字數 1791 閱讀 4190

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自動分析是否當前程序的某個子程序已經退出,如...