fork() and printf()
As I understood fork() creates a child process by copying the image of the parent process.
My question is about how do child and parent processes share the stdout stream?
Can pr开发者_如何学Gointf() function of one process be interrupted by other or not? Which may cause the mixed output.
Or is the printf() function output atomic?
For example:
The first case:
parent: printf("Hello");
child: printf("World\n");
Console has: HeWollorld
The second case:
parent: printf("Hello");
child: printf("World\n");
Console has: HelolWorld
printf()
is not guaranteed to be atomic. If you need atomicity, use write()
with a string, preformatted using s*printf()
etc., if needed. Even then, you should make the size of the data written using write()
is not too big:
Write requests of
{PIPE_BUF}
bytes or less shall not be interleaved with data from other processes doing writes on the same pipe. Writes of greater than{PIPE_BUF}
bytes may have data interleaved, on arbitrary boundaries, with writes by other processes, whether or not theO_NONBLOCK
flag of the file status flags is set.
stdout is usually line-buffered. stderr is usually unbuffered.
The behavior of printf() may vary (depending on the exact details of your OS, C compiler, etc.). However, in general printf() is not atomic. Thus interleaving (as per your 1st case) can occur
精彩评论