2012-08-06 62 views
0

可能重複:
How is it possible for fork() to return two values?爲什麼fork()的返回值在C中有2個pid值?

我是新的C,我感到困惑的fork()函數的返回值結構。

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int main(){ 
    pid_t childPid; 
    childPid = fork(); 
    printf("%d\n",childPid); 
    return EXIT_SUCCESS; 
} 

的輸出是:

28501 
0 

由於pid_ t爲int類型,如何在有childPid 2個值?

+1

在詢問這裏之前,先做叉子的基本搜索。它的基本問題。 – Viswesn 2012-08-06 07:29:07

回答

6

你實際上看到了兩個可執行文件的輸出。當你打電話給fork()時,這個過程克隆自己,給出兩個過程。父進程獲取子進程的PID作爲返回值,並且子進程獲得0作爲返回值。

訣竅是,克隆人分享 STDIN,STDOUT和STDERR。當父母到達printf時,它會打印出它的值,就像孩子一樣,所以你可以看到兩個PID,兩個進程共享相同的STDOUT - 在你的程序中沒有明顯的方法來區分它們。

嘗試重寫它:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int main(){ 
    pid_t childPid; 
    childPid = fork(); 
    if(childPid != 0) 
     printf("I'm the parent and my child PID is %d\n",childPid); 
    else 
     printf("\tI'm the child, so I received %d\n",childPid); 

    return EXIT_SUCCESS; 
} 

,你會清楚地看到這更多。

要獲得額外的功勞,請查看wait()系統調用,並使用它來使父節點在子節點後終止。

6

成功fork成功後,您有兩個進程,父(forker)和子進程。新創建的子進程返回值爲0。這是它是孩子的​​信號。

所以你看到父進程打印孩子的實際PID,子進程打印0。這是按預期工作,除非我在你的問題中遺漏了一些東西?

+0

感謝您糾正我的問題。對於這個noob問題抱歉,因爲c有很多低級的東西,我從來沒有經歷過腳本語言 – mko 2012-08-08 03:09:46