獻上代碼,不成敬意: ~~~~ include include int main() { int i = 0; if(fork()) i++; if(fork()) i++; if(fork()) i++; printf("i = %d\n",i); return 0; } ~~~~ 一段看似簡單但 ...
獻上代碼,不成敬意:
#include <unistd.h>
#include <stdio.h>
int main()
{
int i = 0;
if(fork())
i++;
if(fork())
i++;
if(fork())
i++;
printf("i = %d\n",i);
return 0;
}
一段看似簡單但實際上卻很難一下說出結果的程式,最後的輸出會是什麼呢?
首先說一下fork的定義:
fork函數將運行著的程式分成兩個(幾乎)完全一樣的進程,每個進程都啟動一個從代碼的同一位置開始執行的線程。這兩個進程中的線程繼續執行,就像是兩個用戶同時啟動了該應用程式的兩個副本。 --- 《百度百科》
返回值:
若成功調用一次則返回兩個值,子進程返回0,父進程返回子進程標記(>0);否則,出錯返回-1。
這樣的話,我們似乎知道了些什麼。父進程的返回值是1,那麼只有在父進程中才會執行 i++ 操作,子進程則不會執行。
talk is cheap, show you the picture(程式的整個流程):
有一點需要註意:
子進程只是父進程存儲空間的“副本”,這意味著父子進程間不共用這些存儲空間。這就是為什麼i在子進程中進行加1操作,而父進程中i值不變的原因。
最後貼上該程式在Linux上的運行結果:
與分析一致,結題。