fork() == 0 returns 是什么意思?

What does fork() == 0 returns?

我有 2 个程序,我对子进程中 fork() 的 return 很困惑

第一个程序将调用 fork() 并将其分配给 p。当p == 0时,表示子进程。

// The first program
p = fork();
if (p == 0)
{
    // child process
}
else
{
    // parent process or exception
}

但是如果我们只调用 fork() == 0 呢? 我会认为 fork() return non-zero 来自 docs。 因此条件永远不会执行。

// The second program
if (fork() == 0)
{
    // Would this ever be reached?
    printf("A\n");
}

printf("B\n");

fork 创建一个新进程作为调用它的进程的相同副本。它返回两次。一次在原始调用者(父进程)中使用新创建的子进程的 PID and一次在新创建的子进程中使用 0.

因此,如果您这样做 if (fork() == 0) { ... },if 主体中的代码将 运行 在新创建的子项中。

但是不要这样做,因为父级确实需要知道子级的 PID,因为它必须 wait 为此。

fork成功时,returns子进程的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()。在第一个代码中,它的 return 值被记录在一个变量中,然后测试记录的值是否与零相等(在 parent 和 child 中,假设 fork() 成功)。在第二个代码中,直接测试 fork() 的 return 值是否与零相等,而不是在变量中捕获它。没有理由认为这会产生与第一个代码不同的比较。

是的,如果 fork() 成功,那么它将 return 在 child 进程和 non-zero 中归零(child 的进程 ID)在 parent 过程中,因此无论使用哪种形式, == 0 分支将在 child 中进行,但不会在 parent.

中进行