为什么 fork 有时返回父级,有时返回子级?

为什么 fork 有时返回父级,有时返回子级?

当运行fork创建新进程的调用时,如果成功,它将返回0(子进程)或父进程。

我不明白这背后的想法。为什么不fork总是返回child或总是parent

答案1

当您执行 时fork(),正在运行的代码会发现自己在两个进程中运行(假设分叉成功):一个进程是父进程,另一个是子进程。fork()在子进程中返回 0,在父进程中返回子 pid:它完全是确定性的。

这是您可以在 后确定fork()您是在父级还是子级中运行的方法。 (还有父进程如何知道子进程 pid——它需要在某个时刻等待它。)

更详细一点:

  • 未来的父进程调用fork()
  • 内核创建一个新进程,即子进程,并适当地设置各种内容 - 但两个进程都在运行相同的代码并“等待”同一函数的返回;
  • 两个进程都继续运行(不一定立即,也不一定同时,但这不是重点):
    • fork()返回 0 给子进程,子进程继续并使用该信息来确定它是子进程;
    • fork()将子进程 pid 返回给父进程,父进程继续并使用该信息来确定它是父进程。

答案2

系统fork()调用总是“返回两次”(除非失败)。在父进程中,它返回子进程的 PID,在子进程中,它返回零。

通常的流程是

pid_t pid;
int status;

pid = fork();

if (pid == 0) {
  run_child_stuff();
  exit(0);
} else if (pid > 0) {
  run_parent_stuff();
  wait(&status); /* wait for child to exit */
} else {
  /* handle failure to fork */
}

...或类似的。

相关内容