2012-04-15 84 views
2

我正在研究系統編程系統調用。我的任務中有一個代碼塊(在下面給出)。這個問題問我要打印多少個A,B或C.我的問題是if(pid == 0)的含義是什麼?我猜if(pid == 0)意味着錯誤,所以我分析2 x A和2 x B將被打印。我是寫還是?第二個問題是pid2 = fork()再次執行main嗎?系統編程 - 叉()方法

int main() 
{ 
    int pid,pid2; 
    int i; 
    pid = fork(); 
    printf("A\n"); 
    if (pid == 0) 
    pid2=fork(); 
    if (pid2) 
    printf("B\n"); 
    printf("C\n"); 
    return 0; 
} 
+0

PID == 0意味着當前進程的孩子。 – Aslan986 2012-04-15 19:45:54

+1

@ Aslan986 - 你不是那個孩子嗎? – 2012-04-15 19:46:47

+0

是的,當然,對不起。 – Aslan986 2012-04-15 19:47:41

回答

6

系統調用fork是特殊的。你可以稱它爲它返回兩次。一旦進入孩子,一旦進入父母。

在父它返回兒童的PID和在子返回0。因此,if (pid == 0)指「如果是孩子」。

3

fork返回0子進程和孩子的父進程的PID。手冊頁應該清除其他所有內容。

2

叉返回2個值:

  • 在子進程0和在父進程正值。
  • 在fork()調用之後,您將有2個進程(如果沒有發生錯誤,則返回-1)。

在你的榜樣,您創建3個流程,將輸出2A,1B和3C

0

他返回fork調用的返回值,根據其proccess您目前有不同的值。

比方說,你想在父進程要執行一些代碼,你會普,在這種情況下塊的部分代碼:

p = fork(); 
if (p > 0) 
{ 
    // We're the parent process 
} 

如果你想在子進程來執行一些代碼同樣的情況也適用:

p = fork(); 
if (0 == p) 
{ 
    // We're the child process 
} 

,其餘的一個else塊(由父母雙方進程和子執行)。

1

pid2未在父進程情況下初始化。將要打印多少個B是未定義的行爲。

pid=fork()不執行main()再次,希望能......

+0

關於pid2未初始化的評論很重要! – DrP3pp3r 2015-02-13 12:55:30