开发者

fork() and printf()

开发者 https://www.devze.com 2022-12-18 04:47 出处:网络
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?

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 the O_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

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号