返回0給子程序
返回其他值說明fork失敗了
1 #include 2 #include 3
4 int main(void)
5 15 else if(0 < pid)
16
19 else
20
23 24 return 0;
25 }
編譯後執行結果如下:
第一次接觸fork函式,不少同學還以為該程式既執行了 0 < pid 也執行了 0 == pid ,這個很明顯和if的邏輯不符合。
我們使用gdb工具除錯一下,看一下執行結果
第一條將要執行的指令在第7行
輸入n單步執行,下一條將要執行的指令在第9行
繼續輸入n單步執行,列印出了第9行的printf裡面的內容,同時提示下一條執行的指令位於第10行
繼續輸入n,單步執行,這次執行後,多列印了一行this is child process, pid is = 2802
,之後才是即將要執行的第11行。也就是執行完一條 pid = fork()程式就列印出了this is child process, pid is = 2802 該程序的pid號是2802。
,所以沒有列印出
enter the main function,
字串,因為這個字串列印是在fork函式前面呼叫的。要注意的是,fork執行完後對子程序返回0,變數pid值為0,所以才會進入子程序的if(0 == pid)這個分支列印出
child.
1 /*
2 * fork_test.c
3 * version 2
4 * created on: 2010-5-29
5 * author: wangth
6 */
7 #include 8 #include 9
10 int main(void)
11 25 else
26
29 }
30 return 0;
31 }
有了上面第乙個簡單的例子。這個程式我們就根據結果進行直接分析。
第一行的 i 表示是for迴圈的第 i 次。 son/pa表示當前程序執行在子程序還是父程序中。ppid表示當前執行程序的父程序的程序號,pid表示當前程序的程序號,fpid表示fork返回給當前程序的值。
我們把我們當前執行的這個a.out程式稱為父程序。
第一步,通過列印資訊我們知道,在父程序中,i = 0,之後執行 fpid = fork();該步執行完之後,系統中出現了另乙個和當前程序一樣的程序,我們稱為子程序1,從列印資訊可以知道,當前程序即父程序的程序號是2902,子程序1的程序號是2903.當前程序的父程序號為2395. 也即列印出了下面這條資訊。
0 parent 2395 2902 2903
他們的關係就像原部落格主人用單項鍊表,表示的那樣,
2392->2902->2903->null
第二步,通過列印資訊我們知道,和第一步一樣,在父程序中,i = 1,之後執行 fpid = fork();系統出現子程序2,該子程序2的程序號是2904. 也即列印出了下面這條資訊
1 parent 2395 2902 2904
18 for(i = 0;i < 2;i++)
19
25 else
26
29 }
18 for(i = 0;i < 2;i++)
19
25 else
26
29 }
到這裡我們假設2904已經執行完【沒執行完也無所謂】,我們用父程序建立的新程序只有2903還在執行,父程序本身和2904都已經執行完。
18 for(i = 0;i < 2;i++)
19
25 else
26
29 }
在該程序列印出1 parent 2395 2892 2894,
後該程序不會再列印任何資訊,直至結束執行。
最後一步:pid為2905的子程序3複製了它的父程序建立它時的資訊,i = 1 , 返回給它的 fpid為0.
故列印如下。
1 child 2903 2905 0
從列印資訊也可以看出,在執行2905程序時,2903程序還未結束執行。即2903在最後一次執行完printf後和程式結束執行期間,系統程序了任務切換。
LINUX C學習筆記 1 fork 函式
1 fork 函式作用 建立乙個子程序,子程序作為乙個映象與原程序同時執行下去,程序遇到fork 分叉成兩個程序進行下去,這兩個程序互不影響。2 fork 函式的返回值 對於主程序 fork 返回新建的子程序pid,子程序fork 返回0。3 例項 include include includein...
Matlab函式學習(1)
1.find函式 語法 1 ind find x 找出矩陣x中的所有非零元素,並將這些元素的線性索引值 linear indices 按列 返回到向量ind中。如果x是乙個行向量,則ind是乙個行向量 否則,ind是乙個列向量。如果x不含非零元素或是乙個空矩陣,則ind是乙個空矩陣。2 ind fi...
Matlab plot函式學習(1)
1.plot x,y x y 為相應點集 2.plot x,y1,x,y2 在乙個視窗下繪製多條曲線之方法一 3.hold on 在乙個視窗下繪製多條曲線之方法二 plot x,y1 plot x,y2 hold off 4.plot後 xlabel x axis name 設定x y軸名稱 yla...