我遇到了一些测试代码,它直接在终端上执行时提供不同的输出,当它的输出被重定向到文件时:
# include <stdio.h>
# include <stdlib.h>
int main()
{
printf("hello\n");
if(fork() ==0)
{
printf("world\n");
}
}
在终端上输出为:
abhi@ubuntu:~/Desktop/ad/A1/CC$ ./vb
hello
abhi@ubuntu:~/Desktop/ad/A1/CC$ world
(打印世界后光标仍然闪烁,输入后显示正常提示。)
在将输出重定向到文件时:
./vb >v.txt
abhi@ubuntu:~/Desktop/ad/A1/CC$ cat v.txt
hello
hello
world
据我所知,父母不等孩子就打印hello
&amp;回报。然后孩子应该打印world
,代码应该终止。
我无法理解的是,当输出重定向时,代码的行为会有所不同。造成这种情况的原因是什么?
答案 0 :(得分:8)
当stdout重定向到文件时,它不是行缓冲的。当它是tty时,它就是。因此,当写入tty时,printf
立即写入stdout并且“这就是她所写的全部内容”。
但是stdout
被重定向到文件"hello\n"
时仍保留在stdio
缓冲区中。当您fork
时,两个进程(包括子进程和父进程)最终都会得到stdio
个缓冲区的副本,它们会在退出时刷新。
偏离主题:在我看来o/p
是一种写“输出”的非常糟糕的方式 - 我讨厌用一千个太阳的白热强度。