【问题标题】:What does fork() == 0 returns?fork() == 0 返回什么?
【发布时间】:2021-05-04 20:45:23
【问题描述】:

我有 2 个程序,我对子进程中 fork() 的返回感到非常困惑

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

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

但是如果我们只调用fork() == 0 呢? 我认为fork() 从它的docs 中返回non-zero。 因此条件永远不会被执行。

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

printf("B\n");

【问题讨论】:

  • “我认为 fork() 返回非零” - 为什么?
  • 不要以这种方式更改问题,因为它会使所有 cmets 或答案无效。保留原始问题并在下面写新内容
  • 分配给p 不会改变任何东西。
  • '没有足够的文档来说明 fork() 的工作原理'——这完全是错误的。

标签: c if-statement unix fork unistd.h


【解决方案1】:

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

所以如果你做if (fork() == 0) { ... },if 体内的代码将在新创建的子进程中运行。

但是不要这样做,因为父母确实需要知道孩子的 PID,因为它必须wait 才能获得。

【讨论】:

  • 那么,输出是 BAB 吗?父打印 B 子打印 A 跟随 B?
  • @Peter 或 ABB 之后 fork 未定义接下来运行哪个进程。因此,孩子可能会在父母有机会打印其 B 之前运行。
【解决方案2】:

fork成功时,将子进程的PID返回给父进程,子进程返回0。

失败时,在父进程中返回-1,不创建子进程。

errno 设置得当。

您的代码所做的只是检查它是子进程

// The second program
if (fork() == 0)
{
    // Would this ever be reached?
}

【讨论】:

    【解决方案3】:

    你似乎对 ...

    // 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 分支子节点,但不在父节点中。

    【讨论】:

      猜你喜欢
      • 2017-02-14
      • 1970-01-01
      • 2016-08-07
      • 2014-11-01
      • 1970-01-01
      • 2011-07-31
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      相关资源
      最近更新 更多