0

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

输出是:

28501
0

由于pid_t 是一种int类型,那么 t 如何childPid具有 2 个值?

4

2 回答 2

7

您实际上看到了可执行文件的两个副本的输出。当您调用 时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()系统调用,并使用它使父级在子级之后终止。

于 2012-08-06T04:02:35.443 回答
6

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

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

于 2012-08-06T04:02:37.237 回答