【问题标题】:Return value of child processes in fork()fork()中子进程的返回值
【发布时间】:2023-01-19 02:16:00
【问题描述】:

我知道子进程将返回 0,而父进程将返回子进程的 PID 值。但是,如果调用多个 fork() 函数,子进程(或分叉 >= 2 次的进程)的子进程的返回值是多少?例如在:

int main()
{
   Fork();
   Fork();
   printf("hello\n");
   exit(0);
}

fork() 被调用了两次,因此子进程也将继续分叉。那么对此,从子进程中fork出来的进程会不会全部归0呢?任何帮助将不胜感激。

【问题讨论】:

  • 您是否考虑过实际捕获返回值并将其打印出来?这将快速回答您的问题。
  • 另外,这里是C,区分大小写; Forkfork 不同。
  • 如果您在进程 P 中调用 fork(),它会在 P 中返回新子进程的 PID,并在 P 的新子进程中返回 0。P 有多少个父进程并不重要,如果您同时执行了一个新程序,或者只是在没有它的情况下分叉了多次。

标签: c fork


【解决方案1】:

如果我们稍微重写这段代码,输出可能会很有启发性。

int main()
{
   int a, b;
   printf("pid=%d
",getpid());
   a=fork();
   printf("pid=%d a-fork=%d
",getpid(), a);
   b=fork();
   printf("pid=%d a-fork=%d b-fork=%d
",getpid(), a, b);
   
}

当我运行它时,它的输出是:

pid=285
pid=285 a-fork=286
pid=286 a-fork=0
pid=285 a-fork=286 b-fork=287
pid=286 a-fork=0 b-fork=288
pid=287 a-fork=286 b-fork=0
pid=288 a-fork=0 b-fork=0

因此,父进程调用 fork 并创建进程 286。 然后父进程再次调用fork,创建进程287。

同时,进程 286 调用 fork 并创建进程 288

图形化:

      a-fork  b-fork
285 -> 286,   287
       286 -> 288

请注意,这些顺序可能会有所不同。 在父母完成第二个分叉之前,没有什么可以阻止第一个孩子分叉。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多