« 同期/息切れ | トップページ | Profiling python with fridge / 2 »

同期/息切れ /2

結局子プロセスの標準入出力との同期の問題はかなりややこしい問題であることが判明.
期待するスケジューリングは

    
  子プロセス    ソケット                 親プロセス
1. 入力待ち状態 書き込み可能状態   
2. read状態       write状態
3.     write終了
4. read終了        
5. write状態     読み出しブロック    読み込み待ち            
6. ...                    
7. ...                    
8. write終了     読み出し可能状態  read状態 
9. 入力待ち状態 書き込み可能状態   

みたいな感じなんだけど,何がややこしいかってどのデータがどのタイミングでどこにいて,どの状態に遷移しているのかがよくわからんこと.

子プロセスが何に化けるかはわからないから,子プロセス側で入出力のタイミングだけロックすることはできない. ソケットはキューを持っているのでソケットのI/O可能状態は子プロセスのそれとは一致しないからselectしても無駄.waitはシグナルによる状態変化かプロセス終了しか待てないので対話的な通信には無意味.

結局断続的にとどくデータをどこまで読めばよいのか判断する一般的な方法が見付からなかったため,/procから子プロセスの状況を調べて,子プロセスがwaiting状態になるか終了するまで待つという同期のとりかたを実装してみた.結果8割程度は期待どおりに動くようになった.
この手の同期を実装したプログラムなんていくらでもありそうと思ったんだけど,意外と「コレだ」っていう方法が見付からなかった.

« 同期/息切れ | トップページ | Profiling python with fridge / 2 »

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/163977/3822530

この記事へのトラックバック一覧です: 同期/息切れ /2:

« 同期/息切れ | トップページ | Profiling python with fridge / 2 »