fork() 和 printf()

发布于 2024-08-18 16:10:29 字数 400 浏览 4 评论 0原文

据我了解, 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

拒绝两难 2024-08-25 16:10:29

printf() 不保证是原子的。如果需要原子性,请将 write() 与字符串一起使用,并根据需要使用 s*printf() 等进行预格式化。即使如此,您也应该使使用 write() 写入的数据大小为 不要太大

{PIPE_BUF} 字节或更少的写入请求不得与在同一管道上进行写入的其他进程的数据交错。大于 {PIPE_BUF} 字节的写入可能会在任意边界上与其他进程的写入交错数据,无论文件状态标志的 O_NONBLOCK 标志是否设置.

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.

梦里兽 2024-08-25 16:10:29

标准输出通常是行缓冲的。 stderr 通常是无缓冲的。

stdout is usually line-buffered. stderr is usually unbuffered.

美羊羊 2024-08-25 16:10:29

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文