I came across some test code which is giving different output when executed on terminal directly and when its output is redirected to a file:
# include <stdio.h>
# include <stdlib.h>
int main()
{
printf("hello\n");
if(fork() ==0)
{
printf("world\n");
}
}
On the terminal the output is:
abhi@ubuntu:~/Desktop/ad/A1/CC$ ./vb
hello
abhi@ubuntu:~/Desktop/ad/A1/CC$ world
(The cursor is still blinking after printing world & normal prompt is shown after enter is pressed.)
On redirecting output to a file:
./vb >v.txt
abhi@ubuntu:~/Desktop/ad/A1/CC$ cat v.txt
hello
hello
world
As far as I understand the parent is not waiting for child it prints hello & returns. The child then should print world and the code should terminate.
What I am not able to understand is why the code is behaving differently when its output is redirected. What is the cause of this?
When stdout is redirected to a file, it’s not line buffered. When it’s a tty, it is. So when writing to a tty the
printfimmediately writes to stdout and “that’s all she wrote”.But when
stdoutis redirected to a file"hello\n"remains in thestdiobuffer. When youfork, both processes (both the child and the parent) end up with a copy of thestdiobuffers, which they flush at exit.Off-topic: in my opinion
o/pis a really really bad way to write “output” – I hate it with the white-hot intensity of a thousand suns.