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

mko*_*mko 0 c fork process

可能重复:
fork()如何返回两个值?

我是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;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

28501
0
Run Code Online (Sandbox Code Playgroud)

由于pid_t是一个int类型,如何childPid有2个值?

Cha*_*tin 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;
}
Run Code Online (Sandbox Code Playgroud)

你会更清楚地看到这一点.

要获得额外的功劳,请查看wait()系统调用,并使用它来使父级在子级之后终止.


pb2*_*b2q 6

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

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