问题描述
我有 2 个程序,我对子进程中 fork() 的返回感到非常困惑
第一个程序将调用 fork()
并将其分配给 p
。当 p == 0
时,表示子进程。
// The first program
p = fork();
if (p == 0)
{
// child process
}
else
{
// parent process or exception
}
但是如果我们只调用 fork() == 0
呢?
我认为 fork()
从它返回 non-zero
是 docs。
因此,条件永远不会执行。
// The second program
if (fork() == 0)
{
// Would this ever be reached?
printf("A\n");
}
printf("B\n");
解决方法
fork
创建一个新进程作为调用它的进程的相同副本。它返回两次。一次在原始调用者(父进程)中使用新创建的子进程的 PID 一次在新创建的子进程中使用 0。
因此,如果您执行 if (fork() == 0) { ... }
,则 if 正文中的代码将在新创建的子项中运行。
但是不要这样做,因为父母确实需要知道孩子的 PID,因为它必须wait
。
fork
成功时返回子进程的PID给父进程,子进程返回0。
失败时,父进程返回-1,不创建子进程。
errno
设置适当。
你的代码所做的只是检查它是子进程
// The second program
if (fork() == 0)
{
// Would this ever be reached?
}
,
你似乎对……没问题
// The first program
p = fork();
if (p == 0)
{
// child process
}
...,还有待质疑...
// The second program
if (fork() == 0)
{
// Would this ever be reached?
printf("A\n");
}
。然而,目前尚不清楚为什么您认为对条件评估有任何意义的差异。
在这两种情况下,都会调用 fork()
。在第一个代码中,它的返回值记录在一个变量中,然后测试记录值是否与零相等(在父和子中,假设 fork()
成功)。在第二个代码中,直接测试 fork()
的返回值是否与零相等,而不将其捕获到变量中。没有理由认为这会产生与第一个代码不同的比较。
是的,如果 fork()
成功,那么它将在子进程中返回零,在父进程中返回非零(子进程 ID),因此无论使用哪种形式,== 0
分支会在孩子身上发生,但不会在父母身上发生。