對多程序輸入的理解1

2022-05-02 13:18:08 字數 1192 閱讀 8913

假如在父程序中呼叫了標準io,會在使用者空間產生乙個結構體,其中封裝了檔案io返回的檔案描述符fd,同時還有針對不同函式的輸入輸出緩衝區,與之對應的核心空間也有乙個檔案io建立的結構體。所以,stdin、stdout和stderr都指向的是使用者空間的那個結構體,型別是file *。

當呼叫fork函式建立了子程序後,對於核心空間的那個結構體,子程序不會拷貝,但是對於使用者空間的那個結構體,子程序會進行拷貝。即:子程序中的stdin、stdout和stderr的指向是與父程序中的stdin、stdout和stderr不同的(所以子程序的輸入緩衝區與父程序的輸入緩衝區不在乙個位置,同理,他倆的輸出緩衝區也不在乙個位置),但是核心空間的那個結構體是相同的。

下面乙個例子:

1:  #include
2:  #include
3:  #include
4:
5:
6:  

int main(void)

7:  ;
10:
11:  

if((pid = fork()) == -1)

12:
16:  

if(pid == 0)

17:
21:  

else

22:
28:  

return 0;

29:  }
看一下輸出結果:

結果描述:執行後,過了一秒,螢幕輸出parent,然後回車換行,程式退出。儘管父程序呼叫了函式fflush,程式沒有輸出child 這句話,這充分說明了,父子程序的輸入輸出緩衝區是不同的。至於程式為什麼會退出?解釋:其實這個時候子程序還沒有退出,只是變成了乙個孤兒程序,由init程序管理,子程序已經脫離bash終端,成為後台程序,或者說bash終端已經失去對子程序的控制。

執行命令 ps –ef 可以看到:./a.out的父程序號變成了1,即init程序。執行命令 kill –9 6869 可以將其殺死。

對多程序輸入的理解1

假如在父程序中呼叫了標準io,會在使用者空間產生乙個結構體,其中封裝了檔案io返回的檔案描述符fd,同時還有針對不同函式的輸入輸出緩衝區,與之對應的核心空間也有乙個檔案io建立的結構體。所以,stdin stdout和stderr都指向的是使用者空間的那個結構體,型別是file 當呼叫fork函式建...

多程序對 MySQL update的影響

今天要做資料清洗的時候,要更新乙個資料庫字段,考慮到用多程序去更新資料庫,也許程式會跑得快一些,結果開了64個程序,結果是其他程式更新的時候,速度非常慢,最後發現的原因是,資料庫中有64個sql語句執行更新,這樣就導致了對資料庫進行增刪改查的速度很慢。這是乙個血的教訓,所有以後的操作盡量少用多程序更...

PHP多程序(1)PHP多程序初探

近日在開發過程 現了乙個奇葩問題。在我使用 php子程序處理發郵件的時候,在隔天再次1觸發相關 流程時,會把昨天的資料從使用子程序後再次重新處理一遍。導致資料出現重複,引發髒資料。為此,優化了 並且重新梳理了一下關於php多程序的問題。實際上php是有多程序的,有一些人在用,總體來說php的多程序還...