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

mik*_*mik 3 process fork

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

我没有理解这背后的想法。为什么不fork总是返回child或总是parent

Ste*_*itt 11

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

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

更详细一点:

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

  • @Makhlouf 想象一下,如果你突然生了一个同卵双胞胎,带着你所有的记忆等,做和你完全一样的事情——你怎么知道哪个是原始的,哪个是新产生的双胞胎? (6认同)
  • @MakhloufGharbi 它复制了流程上下文。这就是它的用途。 (2认同)
  • @StephenKitt 嗯,显然我是原创者(我也是) (2认同)