This question already has answers here:
Working of fork() in linux gcc [duplicate]
(5 个回答)
7年前关闭。
简单的一段代码:
根据我对 fork() 的理解,在这段代码执行后,我们将有 3 个子进程和 1 个父进程。同样,每当我们调用 fork() 时,执行都应该从 fork() 语句之后的语句开始。因此,根据我的说法,“过程”应该只打印一次。但是在我的输出过程中被打印了 4 次。这怎么可能?
或调用
或使用
无论使用哪种方式,您都只会看到一次输出。
注意:有关在代码中多次调用
(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/