为什么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个值?
你实际上看到了两个可执行文件的输出。当你打电话给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
。这是按预期工作,除非我在你的问题中遗漏了一些东西?
感谢您纠正我的问题。对于这个noob问题抱歉,因为c有很多低级的东西,我从来没有经历过脚本语言 – mko 2012-08-08 03:09:46
在询问这里之前,先做叉子的基本搜索。它的基本问题。 – Viswesn 2012-08-06 07:29:07