This question already has answers here:
Working of fork() in linux gcc [duplicate]

(5 个回答)


7年前关闭。




简单的一段代码:
#include <stdio.h>
#include <string.h>

main()
{
     printf("Process");
     fork();
     fork();
     return 0;
}

根据我对 fork() 的理解,在这段代码执行后,我们将有 3 个子进程和 1 个父进程。同样,每当我们调用 fork() 时,执行都应该从 fork() 语句之后的语句开始。因此,根据我的说法,“过程”应该只打印一次。但是在我的输出过程中被打印了 4 次。这怎么可能?

最佳答案

因为默认情况下标准输出是行缓冲的,所以当您调用 fork() 时,所有子进程都会继承输出缓冲区。

有几种不同的方法可以改变这种行为:

在末尾添加一个新行字符:

printf("Process\n");

或调用 fflush() 来刷新输出:
printf("Process");
fflush(stdout);

或使用 setbuf() or setvbuf() 将标准输出更改为不缓冲:
setbuf(stdout, NULL);
printf("Process");

无论使用哪种方式,您都只会看到一次输出。

注意:有关在代码中多次调用 atexit() 的错误,请参阅 @Dvaid Schwartz's answer

关于c - 如果我在 main 中调用 fork() 会发生什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22008504/

10-12 14:58
查看更多