今日の役に立たない一言 - Today’s Trifle! -

古い記事ではさまざまなテーマを書いていますが、2007年以降はプログラミング関連の話がほとんどです。

名前付きパイプでも悩む

Windowsの名前付きパイプって、双方向でRead/Writeできるのはいいんだけど、現実的には双方向では使いにくい。*1
二つのアプリケーション非同期通信を行う場合は、両方のアプリケーションで受信スレッドを作って、Readでブロックさせておくとともに、送信データをWriteする。このような状況での名前付きパイプの使用は、Writeしたアプリケーション自身が、自分がWriteしたデータをReadしてしまうという状況が発生する。
これを回避するには、Read用パイプとWrite用パイプの二つを作成し、二つのアプリケーションが相互にReadとWriteを接続するしかない、ということらしい。
つまり、二つのアプリケーションが以下のような同期通信を行う場合に限り、名前付きパイプの双方向Read/Writeが使えるわけだ。
1.アプリケーションAがReadで待っていて、アプリケーションBがそこにWriteする。
2.アプリケーションBはWriteした後、処理結果を受信のためにReadで待つ。
3.アプリケーションAは受信結果を処理してWriteする。
しかしこの場合にも以下の問題がある。

  • アプリケーションAがReadする前にアプリケーションBがReadする可能性を否定できない。
  • アプリケーションBの処理はWriteで始まるため、WriteするまでアプリケーションAの終了を知ることができない。

名前付きパイプを二つ(Read用とWrite用)作らずに、つまりひとつだけの名前付きパイプでこれらの問題を回避する方法はあるんだろうか?
知っている方がいらっしゃったら教えてください。

*1:UNIXの名前付きパイプは単方向通信しかサポートしていない