mandavi mandavi - 2 months ago 16
C Question

Need to know how fork works?

I am trying the following C code:

int main()
{
printf("text1\n");
fork();
printf("text2\n");
return 0;
}


I was expecting to get the output where i get two "text1" and two "text2", like:

text1
text1
text2
text2


But, i am, instead, getting:

text1
text2
text2


only one "text1"???
Ok, if child process executes from the fork(), then why do i get two "text1" for following:

int main()
{
printf("text1");
fork();
printf("text2\n");
return 0;
}


the output now is:

text1text2
text1text2


If the child process starts after the fork, output should be:

text1
text2
text2

Answer

fork() creates a new process by copying everything in the current process into the new process. That typically includes everything in memory and the current values of the CPU registers with some minor adjustments. So in effect, the new process gets a copy of the process's instruction pointer as well so it resumes at the same point where the original process would continue (the instruction following the fork()).


To address your update, printf() is buffered. Normally the buffer is flushed when it encounters a newline character at the end, '\n'. However since you have omitted this, the contents of the buffer stays and is not flushed. In the end, both processes (the original and the child) will have the output buffer with "text1" in it. When it eventually gets flushed, you'll see this in both processes.

In practice, you should always flush files and all buffers (that includes stdout) before forking to ensure that this does not happen.

printf("text1");
fflush(stdout);
fork();

The output should look like this (in some order):

text1text2
text2