为什么fork()的返回值在C中有2个pid值?

问题描述:

可能重复:
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

你实际上看到了两个可执行文件的输出。当你打电话给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()系统调用,并使用它来使父节点在子节点后终止。

成功fork成功后,您有两个进程,父(forker)和子进程。新创建的子进程返回值为0。这是它是孩子的​​信号。

所以你看到父进程打印孩子的实际PID,子进程打印0。这是按预期工作,除非我在你的问题中遗漏了一些东西?

+0

感谢您纠正我的问题。对于这个noob问题抱歉,因为c有很多低级的东西,我从来没有经历过脚本语言 – mko 2012-08-08 03:09:46