fork函式每呼叫一次,函式返回兩次,新程序(子程序)中返回0,原程序(父程序)中返回子程序的pid。
q:為什麼不是子程序中返回父程序pid,父程序中返回0呢?
那是因為乙個父程序有很多子程序,如果不返回其特定子程序的pid,之後需要呼叫其子程序時就找不到這個子程序了;而乙個子程序只有乙個父程序,如果要看其父程序的pid只需要通過呼叫getppid()函式即可。
舉乙個簡單的例子
**如下圖
**實現過程分析
在linux gcc環境下的執行結果為
由此延伸幾個fork函式的應用
例一:
執行一次結果:aabbabvoid main()
}
執行兩次結果:aababb
… …
執行n次結果:總是包含3個a,3個b
**執行過程分析
注:fork函式呼叫之後,哪個程序優先執行,與作業系統的程序排程演算法和當前計算機環境有關,列印出來的先後是不定的。
例二:
執行結果:aabvoid main()
**執行過程分析
例三:注: 1||1 = 1;1 || 0 = 1;0 || 1 = 1;0 || 0 = 0
當「||」前為1時,則不用判斷後面乙個;如果「||」之前為0,繼續執行後面表示式。
執行一次結果:aaabbabbvoid main()
}
… …
執行n次結果:總是包含4個a,4個b
**執行過程分析
注:當printf中沒有"\n"時,緩衝區無法重新整理,每個pcb的緩衝區都將保留函式返回的結果,當i = 1時,所產生的子程序將緩衝區也複製過來,因此,例三程式相對於例一就多出了乙個a和乙個b。
最後,在例三函式顯示父程序的執行過程中會出現孤兒程序,所謂孤兒程序就是說父程序已經結束,而子程序未結束,其子程序就成為了孤兒程序。
解決孤兒程序的方法:讓父程序在子程序結束之前進入睡眠狀態,即父程序在子程序結束之前不會結束。pid_t getpid()
//得到pid
ppid_t getppid()
//得到ppid
# define a 5
sleep(a
--);
Linux下的fork 函式
fork fork的英文翻譯是 分叉 同樣在linux中我們也可以理解為如果使用了fork 函式,程序也會 分叉 下面進行具體的說明fork 函式。定義 通過系統呼叫建立乙個與原程序幾乎完全相同的程序,其中新產生的程序成為子程序。原型 pid t fork void fid t相當於int型別特殊之...
linux下fork的使用
需要包含標頭檔案 include include 函式宣告 pid t fork void 其中pid t在sys types.h中定義 typedef pid t pid t 可以看到只是乙個int.fork 通過複製呼叫過程來建立乙個新過程。新程序稱為子程序,與呼叫程序 稱為父程序 完全相同,但...
fork 函式 fork 函式的使用
fork的意思是個叉子,在unix及其衍生版linux中,用於建立子程序,現在看一下fork函式的基本用法。include includeint main printf c b fflush stdout fork printf c c fflush stdout 上圖的輸出是什麼呢?答案是 bab...