Redirect Standard Output Multi-Process

Hi,

I'm trying to compile the following code:

/************** Begin <test.c> ***************/

/*

  • Compiled with: gcc -Wall -o test test.c
    */

#include <stdio.h>
#include <unistd.h>

int main(void)
{
printf("I'm process %d, son of %d \n", getpid(), getppid());
printf("Hello \n");
fork();
printf("Everyone \n");
printf("I'm process %d, son of %d \n", getpid(), getppid());
return(0);
}

/************** End <test.c> ***************/

I compile it like:
$ gcc -Wall -o test test.c

Then, if i test it leaving the output to standard output i have:
$ ./test
I'm process 1568, son of 1541
Hello
Everyone
I'm process 1568, son of 1541
Everyone
I'm process 1569, son of 1

If i redirect the output to a file i have:
$ ./test > file.txt
$ cat file.txt
I'm process 1571, son of 1541
Hello
Everyone
I'm process 1572, son of 1571
I'm process 1571, son of 1541
Hello
Everyone
I'm process 1571, son of 1541

My question is if it should happen like this.
How can i redirect the output to a file and have the same as if i
leave it to standard output.
Why is the son process executing the print before the fork? Is it buffered text?
Would like your help on this subject.

Best regards,
Jo�o Jos�

Hi!!

>> printf("I'm process %d, son of %d \n", getpid(), getppid());
>> printf("Hello \n");

This statements are buffered while parent execute them and redirected to a file. As you preformed fork () and redirect it to a file, this line buffers are also copied for child process.
Thus u get "Hello " for child process also.

There is no way to predict in which order the output of two processes will be intermixed, it will vary from one invocation to the next. If you get the same result ten times in a row, that's pure chance. (Still happens.)

try to put fflush(stdout) after printf

#include <stdio.h>
#include <unistd.h>

int main(void)
{
printf("I'm process %d, son of %d \n", getpid(), getppid());
printf("Hello \n");
fflush(stdout);
fork();
printf("Everyone \n");
printf("I'm process %d, son of %d \n", getpid(), getppid());
fflush(stdout);
return(0);
}

:wink:
then the result will be ok :wink:

I think fflush() will not work for here. As standard output uses line buffer, printf() is automatically flushed using "\n"

Seems to me that this is exactly what changes, when stdout is redirected to disk. But an fflush should always flush buffers, so a printf done before forking should not be written twice anymore.