Let's start Scheme

2012-03-01

Win32プロセス

プロセスの実装を何とかしようとしているのだが、調べても答えが出てこない問題がでた。

現状、プロセスを作成した際に標準入力、出力、エラーを名前なしパイプに割り当てている。っで、プロセスは非同期もしくは同期(単に終了まで待つだけ)で起動できるのだが、MSDNを読むと作成されたパイプはバッファーの上限があるらしく、上限に達した場合読み取ってやらないと書き込みができなくなるという。
あんまりログを吐かないプロセスなら問題ないが、mavenでがりがりログを吐く上にコンパイルされるプロジェクトが20以上あるとなるとバッファーの上限はあっという間に超える。
じゃあ、読み取ってやればいいじゃんという話になるのだが、パイプから何かを読み取ろうとした際にまだ何も書き込まれていない状態だと現状EOFを返すのでループで回してもすぐ終了してしまう。っで多分デッドロックというかバッファーがいい感じに満杯になってうんともすんとも言わなくなる。
こういう場合って多くの処理系はどうやって対応しているのだろうか?
とりあえず、読み込みの方をいじった方がいいだろうか?

追記:
いろいろ試してみたのだが、どうやらプロセスの終了を待たずに随時なんらか読み取ってやると、書き込み側のバッファーはいっぱいにならずに済むっぽい。けど、最終的な出力がプロセスが終了するまで待たされるのはなんでだ?この辺は意味不明。
ちなみにYpsilonで試した結果は予定通りに動いていた。ポートのIO周りかな?

追記その2:
プロセスが持ってる入出力ポートのバッファーモードが問題だった。というか、ポート周りのバッファーを貯める仕組みというか、そんなの。とりあえず、プロセスはバッファーモードなしでいくことにする。

No comments:

Post a Comment