在终端上运行时使用fork的代码的不同行为当o / p重定向到文件时

时间:2012-05-30 18:52:25

标签: c linux fork

我遇到了一些测试代码,它直接在终端上执行时提供不同的输出,当它的输出被重定向到文件时:

# 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,代码应该终止。

我无法理解的是,当输出重定向时,代码的行为会有所不同。造成这种情况的原因是什么?

1 个答案:

答案 0 :(得分:8)

当stdout重定向到文件时,它不是行缓冲的。当它是tty时,它就是。因此,当写入tty时,printf立即写入stdout并且“这就是她所写的全部内容”。

但是stdout被重定向到文件"hello\n"时仍保留在stdio缓冲区中。当您fork时,两个进程(包括子进程和父进程)最终都会得到stdio个缓冲区的副本,它们会在退出时刷新。


偏离主题:在我看来o/p是一种写“输出”的非常糟糕的方式 - 我讨厌用一千个太阳的白热强度。