fork程序與快取

2021-06-25 20:21:12 字數 1174 閱讀 5206

題目描述:

請問下面的兩個程式各一共輸出多少個「-」?

#include #include 

#include

int main(void

)

return0;

}

#include #include 

#include

int main(void

)

return0;

}

答案:第乙個程式輸出8個"-",第二個程式輸出6個"-"

解析(**網路):

fork的重要特性:

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

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

ps:unix下的裝置有「塊裝置」和「字元裝置」的概念,所謂塊裝置,就是以一塊一塊的資料訪問的裝置,字元裝置是一次訪問乙個字元的裝置。磁碟、記憶體都是塊裝置,字元裝置如鍵盤和串列埠。塊裝置一般都有快取,而字元裝置一般都沒有快取

下面給出網上的圖例說明,其中綠色的輸出2個"-",棕色輸出2個,淺綠1個,粉色1個,在第乙個程式中最下層在第乙個程式時候,會在緩衝區各放乙個,結束時候快取中的字元會輸出,這樣一共2個。綜上第乙個程式8個"-",第二個程式6個"-".

第乙個程式:

第二個程式:

fork 與殭屍程序

使用fork 函式派生出多個子程序來並行執行程式的不同 塊,是一種常用的程式設計泛型。特別是在網路程式設計中,父程序初始化後派生出指定數量的子程序,共同監聽網路埠並處理請求,從而達到擴容的目的。但是,在使用fork 函式時若處理不當,很容易產生殭屍程序。根據unix系統的定義,殭屍程序是指子程序退出...

fork 與程序管理

fork用於複製程序,建立乙個子程序,被複製的程序稱為父程序,父程序與子程序併發執行 先複製乙個程序控制塊pcb 是乙個結構體,在linux中被稱為程序描述符 再複製程序實體 fork完後,父程序中返回值為pid t型別,值為子程序的pid,子程序中值為0 在兩個程序中,邏輯位址相同,實體地址不一定...

Linux 父子程序與fork

每個程序都有乙個非負整數表示的唯一程序id,如交換程序 即排程程序 id為0,init程序id為1,頁守護程序id為2 原型如下 fork函式被呼叫一次,但返回兩次,兩次返回的區別就是子程序返回的是0,父程序返回的新子程序的id 子程序是父程序的副本,獲得了父程序資料空間 堆和棧的副本 父子程序並不...