在父进程和子进程之间共享用于stdio缓冲的缓冲区是否合法?

时间:2014-04-07 18:29:55

标签: c fork mmap stdio sus

我想知道为stdio流缓冲分配缓冲区是否合法,并将其与setvbuf一起使用(在fork之前),其中缓冲区是匿名mmap - “分配了“父进程和子进程共享的内存块?”

假设两者是同步的,我是否可以假设结果是理智的,或者我是否应该不惜一切代价避免这种情况?

2 个答案:

答案 0 :(得分:3)

你不应该这样做。您的C库将假定进程具有对标准IO缓冲区的独占访问权限,并且仅在该进程的线程之间进行调解,毫无疑问使用不是匿名的互斥锁mmap。因此,如果更改了缓冲区空间,就会冒未定义的行为风险,就像您自己编写它一样。

然而,更好的问题是为什么你想要这样做呢?为什么不使缓冲区/不/共享(例如通过使用malloc()来分配它),那么一切都会正常工作。

答案 1 :(得分:1)

这取决于您的C库实现存储管理缓冲区的控制信息的位置。

如果用于控制线程并发写入的所有控制信息都存储在缓冲区本身内,那么一切都可以正常工作。

但是,如果该控制信息存储在其他位置,则它们将在进程之间重复。当另一个进程写入缓冲区或刷新它时,两个不同进程中的libc实例将无法实现,并且随之而来的是混乱。

即使你的libc实现在这种设置下运行良好,我也强烈反对它。毕竟,setvbuf()的语义是设置缓冲区,而不是存储缓冲区控制信息。