【发布时间】:2014-04-07 18:29:54
【问题描述】:
我想知道为 stdio 流缓冲分配一个缓冲区并将其与setvbuf(在fork 之前)一起使用是否合法,其中缓冲区是匿名的mmap-“已分配”一块内存共享父子进程之间?
假设这两者是同步的,我是否可以假设结果会是正常的,或者我应该不惜一切代价避免这种情况?
【问题讨论】:
-
我认为这还需要进程间互斥锁,我不知道 stdio 会使用它。只是一个想法-我不知道:)。
我想知道为 stdio 流缓冲分配一个缓冲区并将其与setvbuf(在fork 之前)一起使用是否合法,其中缓冲区是匿名的mmap-“已分配”一块内存共享父子进程之间?
假设这两者是同步的,我是否可以假设结果会是正常的,或者我应该不惜一切代价避免这种情况?
【问题讨论】:
你不应该这样做。您的 C 库将假定 进程 具有对标准 IO 缓冲区的独占访问权限,并且只会在该进程的 线程 之间进行调解,毫无疑问使用非匿名互斥锁mmap。因此,如果更改该缓冲区空间,您将面临未定义行为的风险,就像您自己重写它一样。
但是,一个更好的问题是,您到底为什么要这样做?为什么不让缓冲区/not/共享(例如使用malloc()分配),那么一切都会正常。
【讨论】:
exec)或者用管道来做这件事。
这取决于您的 C 库实现存储管理缓冲区的控制信息的位置。
如果所有用于控制线程并发写入的控制信息都存储在内缓冲区本身,那么一切都可以正常工作。
但是,如果该控制信息存储在其他地方,它将在进程之间复制。两个不同进程中的 libc 实例不会意识到另一个进程写入缓冲区或刷新缓冲区,从而导致混乱。
即使您的 libc 实现在此设置下运行良好,我还是强烈建议您不要这样做。毕竟setvbuf()的语义是设置一个缓冲区,而不是存储缓冲区控制信息。
【讨论】: