fork() 和 printf()
据我了解, fork() 通过复制父进程的映像来创建子进程。
我的问题是关于子进程和父进程如何共享标准输出流?
一个进程的 printf() 函数是否可以被其他进程中断? 这可能会导致混合输出。
或者 printf() 函数的输出是原子的吗?
例如:
第一种情况:
parent: printf("Hello");
child: printf("World\n");
Console has: HeWollorld
第二种情况:
parent: printf("Hello");
child: printf("World\n");
Console has: HelolWorld
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 printf() 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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
printf()
不保证是原子的。如果需要原子性,请将write()
与字符串一起使用,并根据需要使用s*printf()
等进行预格式化。即使如此,您也应该使使用write()
写入的数据大小为 不要太大:printf()
is not guaranteed to be atomic. If you need atomicity, usewrite()
with a string, preformatted usings*printf()
etc., if needed. Even then, you should make the size of the data written usingwrite()
is not too big:标准输出通常是行缓冲的。 stderr 通常是无缓冲的。
stdout is usually line-buffered. stderr is usually unbuffered.
printf() 的行为可能会有所不同(取决于操作系统、C 编译器等的具体细节)。然而,一般来说 printf() 不是原子的。因此,可能会发生交错(根据您的第一种情况)
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