考虑以下程序。
main() {
printf("hello\n");
if(fork()==0)
printf("world\n");
exit(0);
}
使用编译此程序./a.out
给出以下输出:
hello
world
编译这个程序使用./a.out > output
在名为“输出”的文件中给出输出,看起来像这样:
hello
hello
world
为什么会这样?
因为当你输出到 shell 时stdout
通常是行缓冲的,而当你写入文件时,它通常是全缓冲的。
之后fork()
,子进程将继承缓冲区,当你输出到shell时,由于换行,缓冲区是空的\n
,但是当你输出到文件时,缓冲区仍然包含内容,并且会在父进程和子进程中输出缓冲区,这就是为什么hello
看到两次。
你可以这样尝试:
int main() {
printf("hello"); //Notice here without "\n"
if(fork()==0)
printf("world\n");
exit(0);
}
hello
当输出到 shell 时,您可能会看到两次。
这个回答在于浩的回答之后。他已经解释了很多。
main() {
printf("hello\n");
fflush(stdout);//flush the buffer
if(fork()==0)
printf("world\n");
exit(0);
}
然后你可以得到正确的输出。