【问题标题】:Why child_1 will print before parent?为什么 child_1 会在 parent 之前打印?
【发布时间】:2021-10-05 00:10:56
【问题描述】:

我有一个 C 代码,父进程将 fork() 子进程:

int main(){
    pid_t child_1;
    child_1 = fork();
    if (child_1 > 0){
        printf("Parent: (PID %d)\n", getpid());
        wait(NULL);
    }
    else if (child_1 == 0){
        printf("child: %d", getpid());
    }
}

输出是:

Parent: (PID 1234)
child: 1235

但如果我删除父级的printf 中的\n,输出将变为:

child: 1235Parent: (PID 1234)

我不知道为什么,我在不同的操作系统上尝试过,结果是一样的。提前致谢。

【问题讨论】:

  • 因为进程可能是并行执行的,严格来说你不应该期望任何特定的顺序。
  • @Cheatah 感谢您的快速回复。所以它不是由printf() 中的\n 引起的,如果我理解正确的话,如果我确实有\n,有时会发生这种情况?但是我一次又一次地尝试运行,无论有没有\n 字符,我总是得到相同的结果。
  • printf 是行缓冲的。这意味着它实际上不会输出,直到遇到换行符或完成显式刷新(例如当进程退出时)。因此,在您的情况下,当父进程实际输出时删除换行符更改。由于父级等待子级退出,这意味着父级刷新将在子级输出后发生。
  • @kaylum 这很有道理,非常感谢。

标签: c fork


【解决方案1】:

printf 是行缓冲的。这意味着它实际上不会输出,直到遇到换行符或完成显式刷新(例如当进程退出时)。因此,在您的情况下,当父进程实际输出时删除换行符更改。由于父级等待子级退出,这意味着父级刷新将在子级输出后发生。

【讨论】:

    猜你喜欢
    • 2016-05-01
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    相关资源
    最近更新 更多