【问题标题】:Program getting split after multiple fork() calls多次 fork() 调用后程序被拆分
【发布时间】:2021-12-12 05:40:37
【问题描述】:

我无法弄清楚为什么以下代码没有产生我期望的结果:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char** argv) {

    int n1 = fork();

    if (n1 == 0) {
        int n2 = fork();
        int n3 = fork();
        int n4 = fork();
    } else if (n1 > 0) {
        int n5 = fork();
    }

    printf("%d with parent %d\n", getpid(), getppid());
}

我希望这可以一次打印所有内容。但是,它会打印第一个进程,然后在程序的新运行中打印其余的进程。它还会输出错误的父 PID,并且不会终止。

【问题讨论】:

  • 执行./mainpgrep main的输出是什么
  • @LinuxGeek 2503 4572 5973

标签: linux ubuntu terminal fork


【解决方案1】:

这不是程序的新运行。

原始父进程不会等待子进程退出。它用int n1 = fork(); 分叉一个孩子,用int n5 = fork(); 分叉第二个孩子。然后它打印它的消息并退出。

shell 只在等待原来的父进程,它对子进程一无所知。退出时,会打印提示。

与此同时,子进程仍在运行。他们在 shell 提示符后打印他们的消息。它们中的一些也可以先打印——它们的运行顺序是不可预测的。

PID 没有错。当父进程在子进程之前退出时,子进程被systemd 继承,所以它的父进程ID 发生了变化。在您的情况下,这是 PID 1256。

【讨论】:

  • 我现在了解打印部分了。但是,我仍然不明白为什么程序没有终止。这就是它的样子,因为父母先退出了吗?
  • 它确实终止了。你没看到输出6600 with parent 1256之前的shell提示吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-08
  • 1970-01-01
  • 2014-02-08
  • 2019-01-31
  • 2017-09-22
  • 2020-12-02
  • 2017-06-16
相关资源
最近更新 更多