pipe+selectでpselect的なことをしたいときに考える事

singnal handlingについてのメモ
3
ひろせ31 @hirose31

wait(@kazuho); RT @__gfx__: @hirose31 http://t.co/q5qMEnZf いちおう実装してみたんですがまだkazuhoさんにちゃんとレビューしてもらってません。

2012-01-12 17:34:05
Kazuho Oku @kazuho

@__gfx__ @hirose31 とりあえず、sysread してないから、1回シグナル受け取っとあとビジーループになるなと思った

2012-01-13 02:08:52
Kazuho Oku @kazuho

あとは、O_NONBLOCK じゃないから CentOS 4 とかで2K個以上のシグナルを一気に受け取ったら死ぬよねとかw

2012-01-13 02:10:28
FUJI Goro @__gfx__

@kazuho あ、書き込んだ分は読み捨てないといけないんですね><

2012-01-13 08:25:39
Kazuho Oku @kazuho

@__gfx__ うん。んで、最後に受け取ったシグナルだけでいいなら、常に write('1') でいいし、binary int32_t でシグナル番号を送る方式でもいいと思う。今のやり方だとどっちなのかわかりづらいというか、write(sig) してるけど文字列になってってて

2012-01-13 08:27:49
Kazuho Oku @kazuho

@__gfx__ write(13);write(12);みたいに呼ばれたケースだとread() すると1312になっちゃうから意味ないしもうちょっと意図がどちらなのか明確に、みたいな感じ

2012-01-13 08:28:38
FUJI Goro @__gfx__

@kazuho I see. int32_tでsig numberを送ることにします。

2012-01-13 08:29:47
Kazuho Oku @kazuho

@kazuho あーあと、書き込み側で O_NONBLOCK にして、write が失敗したら die する感じがいいかなー

2012-01-13 08:32:00
Kazuho Oku @kazuho

@__gfx__ 理論的には。読み込む前にシグナルハンドラが1024回呼ばれると 2.6.11 以前の linux カーネルだと pipe のバッファは 4KB だからうんぬん see @hirose31 and @kosaki55tea 's tweets yesterday

2012-01-13 08:34:33
Kazuho Oku @kazuho

@__gfx__ それ言い始めるなら、書き込み失敗した場合にもシグナル読み落とすようにしてほしいと思うし、それならpipeのバッファがsizeof uint16_tで割り切れるとは限らないので、partial writeの対応考えてください

2012-01-13 08:40:15
Kazuho Oku @kazuho

あるいは、perlの配列にシグナルいれるようにして、pipeのバッファにはとにかく何かが入ってればシグナル配列popするようにするれば、シグナルの読み落としは発生しないよね、とか

2012-01-13 08:41:34
FUJI Goro @__gfx__

@kazuho うは>< sigは配列にpushするようにします!

2012-01-13 08:42:35
FUJI Goro @__gfx__

signalむずかしいです。

2012-01-13 08:42:52
Kazuho Oku @kazuho

SIGHUPを2回連続で受信したとして、2回再起動処理を行うべきなんだろうか。まあいいやw

2012-01-13 08:44:00