In Program 1 Hello world
gets printed just once, but when I remove \n
and run it (Program 2), the output gets printed 8 times. Can someone please explain me the significance of \n
here and how it affects the fork()
?
Program 1
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("hello world...\n");
fork();
fork();
fork();
}
Output 1:
hello world...
Program 2
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("hello world...");
fork();
fork();
fork();
}
Output 2:
hello world... hello world...hello world...hello world...hello world...hello world...hello world...hello world...
Best Answer
When outputting to standard output using the C library's
printf()
function, the output is usually buffered. The buffer is not flushed until you output a newline, callfflush(stdout)
or exit the program (not through calling_exit()
though). The standard output stream is by default line-buffered in this way when it's connected to a TTY.When you fork the process in "Program 2", the child processes inherits every part of the parent process, including the unflushed output buffer. This effectively copies the unflushed buffer to each child process.
When the process terminates, the buffers are flushed. You start a grand total of eight processes (including the original process), and the unflushed buffer will be flushed at the termination of each individual process.
It's eight because at each
fork()
you get twice the number of processes you had before thefork()
(since they are unconditional), and you have three of these (23 = 8).