fork() == 0 返回什么?

问题描述

我有 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-zerodocs。 因此,条件永远不会执行。

// 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 分支会在孩子身上发生,但不会在父母身上发生。