stdio ストリーム バッファリング用にバッファを割り当て、それをsetvbuf
(前にfork
) 使用することが合法であるかどうか疑問に思っていました。ここで、バッファは匿名であり、mmap
親プロセスと子プロセスの間で共有されるメモリの「割り当てられた」部分ですか?
2 つが同期していると仮定して、結果が正気であると仮定してもよいでしょうか、それともこれを何としても避けるべきでしょうか?
これを行うべきではありません。C ライブラリは、プロセスが標準 IO バッファ領域に排他的にアクセスできると想定し、そのプロセスのスレッド間のみを仲介します。間違いなく、匿名ではないミューテックスを使用しmmap
ます。そのため、バッファ スペースが変更された場合、自分で上書きした場合と同様に、未定義の動作が発生する危険があります。
ただし、より良い質問は、一体なぜこれをやりたいのかということです。バッファ領域を共有/非共有にしないのはなぜですか (たとえば、 を使用malloc()
して割り当てます)。そうすれば、すべてが正常に機能します。
これは、C ライブラリの実装がバッファを管理する制御情報を格納する場所によって異なります。
スレッドからの同時書き込みを制御するために使用されるすべての制御情報がバッファー自体に格納されている場合、すべてが正常に機能する可能性があります。
ただし、その制御情報が別の場所に格納されている場合は、プロセス間で複製されます。2 つの異なるプロセスの libc インスタンスは、もう一方のプロセスがバッファーに書き込みまたはフラッシュしたことを認識できず、混乱が生じます。
あなたの libc の実装がこのセットアップで問題なく動作する場合でも、私は強くお勧めしません。結局のところ、 のセマンティックはsetvbuf()
、バッファ制御情報の格納ではなく、バッファを設定することです。