If you compile and run the following program on a *nix system, it may surprise you:

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

int main(int argc, char ** argv)
{
	printf("Hello, World!");
	fork();
	return 0;
}

Or run the equivalent python program:

#!/usr/bin/python
import os, sys
sys.stdout.write('Hello, World!')
os.fork()

You should see this:

Hello, World!Hello, World!

Why is what was
printed only once
appearing twice?

The stdout buffer isn't flushed after the write.
The buffer is duplicated in the fork,
and as the parent and child processes exit,
they both flush their copy of the buffer.
they both flush their copy of the buffer.

To solve this issue, exit with _exit() in the child process.
_exit() doesn't flush the process's files or do things like
call functions registered with atexit().

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

int main(int argc, char ** argv)
{
	printf("Hello, World!");
	if (fork() == 0) _exit(0);
	return 0;
}

#!/usr/bin/python
import os, sys
sys.stdout.write('Hello, World!')
if os.fork() == 0: os._exit(0)

Log in or register to write something here or to contact authors.