fork()之后进程从哪里开始执行

tyy*_*tyy 5 c fork

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>


int main(void) {
    for (int i = 1; i < 4; i++) {
        printf("%d", i);
        int id = fork();
        if (id == 0) {
            printf("Hello\n");
            exit(0);
        } else {
            exit(0);
        }
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

对于此代码,它在我的计算机上打印 11Hello。这对我来说似乎违反直觉,因为“1”被打印了两次,但它是在调用 fork() 之前。

小智 1

fork() 系统调用分叉一个新进程,并在每个进程中并行执行其后面的指令。在您的子进程将 i 的值打印到 stdout 后,它会被缓冲,然后再次打印“i”的值,因为 stdout 未刷新。

使用fflush(stdout);以便每个叉子只打印一次“i”。

或者,您也可以使用printf("%d\n", i);末尾的换行符来完成这项工作。

  • 在假设换行符“完成工作”时要非常小心。*如果* stdout 是行缓冲的,则将换行符附加到传递给“printf”的字符串将触发刷新。但您不应该假设 stdout 是行缓冲的。 (2认同)