简单的代码:
#include <stdio.h>
#include <string.h>
main()
{
printf("Process");
fork();
fork();
return 0;
}
根据我对fork()的理解,在执行此代码之后,我们将有3个子进程和1个父进程。每当我们调用fork()时,执行应该从fork()语句之后的语句开始。因此根据我“过程”应该只打印一次。但在我的输出过程正在打印4次。怎么可能?
答案 0 :(得分:10)
由于默认情况下标准输出是行缓冲的,因此当您调用fork()
时,输出缓冲区将由所有子进程继承。
有几种不同的方法可以改变这种行为:
在最后添加一个新的行字符:
printf("Process\n");
或致电fflush()
以清除输出:
printf("Process");
fflush(stdout);
或使用setbuf()
or setvbuf()
将标准输出更改为不缓冲:
setbuf(stdout, NULL);
printf("Process");
使用任何一种方法,您只会看到输出一次。
注意:有关在代码中多次调用atexit()
的错误,请参阅@Dvaid Schwartz's answer。
答案 1 :(得分:4)
您的程序有错误。 所有子项从main
返回,导致atexit个处理程序运行四次。孩子们应该致电_exit
。
以下是您的代码的外观:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
main()
{
int is_child = 0;
printf("Process");
if (fork() == 0)
is_child = 1;
if (fork() == 0)
is_child = 1;
if (is_child)
_exit(0);
return 0;
}