假如在父程序中呼叫了標準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的多程序還...