1

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

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

4

2 回答 2

3

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

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

于 2014-04-07T19:13:39.093 回答
1

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

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

但是,如果该控制信息存储在其他地方,它将在进程之间复制。当另一个进程写入缓冲区或刷新缓冲区时,两个不同进程中的 libc 实例将不会意识到,从而导致混乱。

即使您的 libc 实现在此设置下运行良好,我强烈建议您不要这样做。毕竟, 的语义setvbuf()是设置一个缓冲区,而不是存储缓冲区控制信息。

于 2014-04-07T19:22:00.400 回答