關於fork函式執行的幾種情況

2021-07-07 05:17:53 字數 1512 閱讀 4282

//輸出6個-

先看這段**:  1

2

3

4

5

6

7

8

9

10

11

12

13

intmain(void)

wait(null);

wait(null);

return0;

}

//輸出8個-

1.fork()系統呼叫是unix下以自身程序建立子程序的系統呼叫,一次呼叫,兩次返回,如果返回是0,則是子程序,如果返回值》0,則是父程序(返回值是子程序的pid),這是眾為周知的。

2.還有乙個很重要的東西是,在fork()的呼叫處,整個父程序空間會原模原樣地複製到子程序中,包括指令,變數值,程式呼叫棧,環境變數,緩衝區,等等。

所以,上面的那個程式為什麼會輸入8個「-」,這是因為printf(「-「);語句有buffer,所以,對於上述程式,printf(「-「);把 「-」放到了快取中,並沒有真正的輸出,在fork的時候,快取被複製到了子程序空間,所以,就多了兩個,就成了8個,而不是6個。

而本題printf("-\n");

程式遇到「\n」,或是eof,或是緩中區滿,或是檔案描述符關閉,或是主動flush,或是程式退出,就會把資料刷出緩衝區。需要注意的是,標準輸出是 行緩衝,所以遇到「\n」的時候會刷出緩衝區,但對於磁碟這個塊裝置來說,「\n」並不會引起緩衝區刷出的動作,那是全緩衝,你可以使用setvbuf來 設定緩衝區大小,或是用fflush刷快取。

關於fork函式

我們可以使用fork呼叫建立乙個新程序,使用fork需包含的標頭檔案及fork的宣告如下 include include pid t fork void 這個系統呼叫複製當前程序,在程序表中建立乙個新的表項,新表項中的許多屬性與當前程序是完全相同的。新程序幾乎與原程序一模一樣,執行的 也完全相同,但...

程式執行析構函式的幾種情況

如果在乙個函式中定義了乙個物件 它是自動區域性物件 當這個函式被呼叫結束時,物件應該釋放,在物件釋放前自動執行析構函式。static區域性物件在函式呼叫結束時物件並不釋放,因此也不呼叫析構函式,只在main函式結束或呼叫exit函式結束程式時,才呼叫static區域性物件的析構函式。如果定義了乙個全...

關於函式返回值的幾種情況

在乙個函式的內部,return 的時候返回的都是乙個拷貝,不管是變數 物件還是指標都是返回拷貝,但是這個拷貝是淺拷貝。1.如果返回乙個基本型別的變數,比如 int a a 5 return a 那麼就會 a的乙個拷貝,即 5返回,然後 a就被銷毀了。儘管 a被銷毀了,但它的副本 5還是成功地返回了,...