考虑以下计划。
main() {
printf("hello\n");
if(fork()==0)
printf("world\n");
exit(0);
}
使用./a.out
编译此程序会得到以下输出:
hello
world
使用./a.out > output
编译此程序会在名为' output'的文件中输出。并且似乎是这样的:
hello
hello
world
为什么会这样?
答案 0 :(得分:15)
因为输出到shell stdout
时通常是行缓冲的,而当你写入文件时,它通常是完全缓冲的。
在fork()
之后,子进程将继承缓冲区,当你输出到shell时,由于新行\n
,缓冲区为空,但是当你输出到文件时,缓冲区仍然是包含内容,并且将在父和子的输出缓冲区中,这就是为什么hello
被看到两次。
你可以这样试试:
int main() {
printf("hello"); //Notice here without "\n"
if(fork()==0)
printf("world\n");
exit(0);
}
输出到shell时,您可能会看到hello
两次。
答案 1 :(得分:3)
main() {
printf("hello\n");
fflush(stdout);//flush the buffer
if(fork()==0)
printf("world\n");
exit(0);
}
然后你就可以得到正确的输出。