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

时间:2012-08-06 03:59:25

标签: c process fork

  

可能重复:
  How is it possible for fork() to return two values?

我是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个值?

2 个答案:

答案 0 :(得分: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()系统调用,并使用它来使父级在子级之后终止。

答案 1 :(得分:6)

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

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