【发布时间】:2016-08-07 00:28:54
【问题描述】:
举个例子:
int main(void)
{
pid_t pid;
pid = fork();
if (pid == 0)
ChildProcess();
else
ParentProcess();
}
如果我错了,请纠正我,一旦 fork() 执行,就会创建一个子进程。现在通过这个answer fork() 返回两次。一次用于父进程,一次用于子进程。
这意味着在 fork 调用期间而不是在它结束之后存在两个独立的进程。
现在我不明白它如何理解如何为子进程返回 0 以及为父进程返回正确的 PID。
这真是令人困惑的地方。这个answer表示fork()通过复制进程的上下文信息并手动将返回值设置为0来工作。
首先我是否正确地说任何函数的返回都放在一个寄存器中? 由于在单处理器环境中,一个进程只能调用一个只返回一个值的子例程(如果我在这里错了,请纠正我)。
假设我在例程中调用函数 foo() 并且该函数返回一个值,该值将存储在 BAR 寄存器中。每次函数想要返回一个值时,它都会使用特定的处理器寄存器。因此,如果我能够手动更改进程块中的返回值,我就可以更改返回给函数的值,对吗?
那么我认为 fork() 的工作原理是否正确?
【问题讨论】:
-
没有“它”可以一次返回两个值。当
fork被调用时,操作系统接管。它创建了进程的两个副本,除了一个内存位置的内容外,所有方面都相同。该内存位置恰好是最终从fork返回的位置。 -
'在 fork 调用期间出现了两个独立的进程' - 不,一个已经存在。在 fork 调用期间会出现第二个进程。
-
@n.m.虽然这甚至没有必要。应用程序或库代码可以将
getpid的结果存储在一个变量中。然后当操作系统返回时,它可以再次调用getpid。在父级中,两者将匹配。在孩子身上,他们不会。你所需要的只是一些东西,任何东西,你可以测试它们两者不同,并且 PID 合格。 -
@DavidSchwartz 但是父母如何获得孩子的 PID?
-
@SebastianRedl 随心所欲。一旦每个进程都知道哪个是哪个,就没有进一步的问题了。例如,系统调用可以将子进程的 PID 返回给两个进程,而子进程可以在父进程返回时忽略它。您需要解决的唯一问题是每个进程如何知道它是哪一个,之后,可以通过向两个进程提供相同的信息并让“错误”进程忽略它来解决其他任何问题。
标签: c unix process fork internals