fork函式學習1

2021-08-20 06:03:24 字數 2655 閱讀 6621

返回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...