pipe+selectでpselect的なことをしたいときに考える事
wait(@kazuho); RT @__gfx__: @hirose31 http://t.co/q5qMEnZf いちおう実装してみたんですがまだkazuhoさんにちゃんとレビューしてもらってません。
2012-01-12 17:34:05@__gfx__ @hirose31 とりあえず、sysread してないから、1回シグナル受け取っとあとビジーループになるなと思った
2012-01-13 02:08:52あとは、O_NONBLOCK じゃないから CentOS 4 とかで2K個以上のシグナルを一気に受け取ったら死ぬよねとかw
2012-01-13 02:10:28@__gfx__ うん。んで、最後に受け取ったシグナルだけでいいなら、常に write('1') でいいし、binary int32_t でシグナル番号を送る方式でもいいと思う。今のやり方だとどっちなのかわかりづらいというか、write(sig) してるけど文字列になってってて
2012-01-13 08:27:49@__gfx__ write(13);write(12);みたいに呼ばれたケースだとread() すると1312になっちゃうから意味ないしもうちょっと意図がどちらなのか明確に、みたいな感じ
2012-01-13 08:28:38@kazuho あーあと、書き込み側で O_NONBLOCK にして、write が失敗したら die する感じがいいかなー
2012-01-13 08:32:00@__gfx__ 理論的には。読み込む前にシグナルハンドラが1024回呼ばれると 2.6.11 以前の linux カーネルだと pipe のバッファは 4KB だからうんぬん see @hirose31 and @kosaki55tea 's tweets yesterday
2012-01-13 08:34:33@__gfx__ それ言い始めるなら、書き込み失敗した場合にもシグナル読み落とすようにしてほしいと思うし、それならpipeのバッファがsizeof uint16_tで割り切れるとは限らないので、partial writeの対応考えてください
2012-01-13 08:40:15あるいは、perlの配列にシグナルいれるようにして、pipeのバッファにはとにかく何かが入ってればシグナル配列popするようにするれば、シグナルの読み落としは発生しないよね、とか
2012-01-13 08:41:34