Linux のシグナルの話

Linux の signalfd(2) を皮切りに、シグナル機構の話とか eventfd の話とか
12
_ko1 @_ko1

signalfd() と sigaction() が同時にあるとどっちが反応するの?

2022-06-15 00:27:59
_ko1 @_ko1

なるほど。 poll vs handler だと handler が勝つ read vs handler だと read が勝つ という感じらしい(手元)

2022-06-15 00:56:20
_ko1 @_ko1

いや、全然不正確だった それはともかく、 > read(2) が行われた結果、シグナルは消費され、これらのシグナルはそのプロセスに対しては処理待ちではなくなる (つまり、シグナルハンドラで捕捉されることもなく、 sigwaitinfo(2) を使って受け取ることもできなくなる)。 書いてあった

2022-06-15 00:57:25
_ko1 @_ko1

まぁ、当然のことながら、混ぜるな危険、と。

2022-06-15 00:57:43
_ko1 @_ko1

gist.github.com/ko1/9fae413fb1… poll vs. sigaction: poll は起きる、handler は実行する、後の read はブロック read vs. sigaction: read が勝つ、handler は実行されない

2022-06-15 01:03:31
_ko1 @_ko1

sigwaitinfo() 使ったことないな

2022-06-15 01:32:58
_ko1 @_ko1

Linux 限定でガンガンに作りこみたい

2022-06-15 01:34:49
_ko1 @_ko1

signalfd で twitter 検索すると、見たことのある名前が並んでた

2022-06-15 01:36:37
_ko1 @_ko1

signalfd で SIGSEGV うけられんのかな

2022-06-15 10:51:05
_ko1 @_ko1

ちゃんと man にダメって書いてあった。

2022-06-15 10:57:18

signalfdは何がおいしいの?

Kazuho Oku @kazuho

signalfd はシグナルハンドラでpipeに書き込むのと比較して何がおいしいのか分かってないクラスタ。移植性がなくなるのだけはわかる

2022-06-15 00:42:26
_ko1 @_ko1

@kazuho いちいち書くのが面倒だったんですかね。大量に signal が送られる app だと性能的にも有利なんでしょうか(SIGCHLD たくさん? aio?)

2022-06-15 01:09:45
Hiroaki Nakamura @hnakamur2

@_ko1 @kazuho 私は全然詳しくないですが Kernel events without kevents [LWN.net] lwn.net/Articles/22571… を見ると「いちいち書くのが面倒」が正解のようです。性能のほうはわかりませんでした。 あと lobste.rs/s/4qi5hg/actua… にkqueueとepoll+signalfdの比較コメントがあって興味深かったです

2022-06-15 02:40:52
_ko1 @_ko1

@hnakamur2 @kazuho ありがとうございます!

2022-06-15 09:02:03
_ko1 @_ko1

@hnakamur2 @kazuho altstack 管理して、 fork 時に pipe 管理して、 pipe のブロック気にして (*)、 とか考えると signalfd 一発でやってくれるのは楽な気がしますね (* RT シグナルじゃないと多分気にする必要ない)

2022-06-15 09:15:22
_ko1 @_ko1

@hnakamur2 @kazuho あ、何も考えずに 1 byte 書き込むと刺さるか

2022-06-15 09:22:52
Kazuho Oku @kazuho

@_ko1 @hnakamur2 * altstackの管理が必要な類のシグナルは同期的に受け取るべき(signalfd使わない) * fork時の管理がめんどいのはsignalfdやepollも同じ * twitter.com/kazuho/status/… こういうロジックならpipe socketはnonblockで全く問題ない みたいな感じでしょうか

2022-06-15 09:38:25
Kazuho Oku @kazuho

@hnakamur2 @_ko1 例えばSIGCHLDだと、 * シグナルハンドラはノンブロックなパイプに1バイト書く * イベントループではパイプから読めたら、wait(NOHANG) が値を返す間回し続ける だけなので

2022-06-15 05:18:45
_ko1 @_ko1

@kazuho @hnakamur2 3 番目、なるほど、シグナルごとに pipe 用意しておけば、nonblock write すればよい、と。

2022-06-15 09:47:52
Kazuho Oku @kazuho

@_ko1 @hnakamur2 あるいはシグナルごとに受信有無を示すビットフラグをグローバル変数としてもっておけば、pipeは一本で済むかと思います

2022-06-15 09:48:55
_ko1 @_ko1

@kazuho @hnakamur2 なるほど、受信側で走査すればよいと。 atomicity ちょっと気にすれば大丈夫と。

2022-06-15 09:51:28
_ko1 @_ko1

@kazuho @hnakamur2 ものぐさなので signalfd が楽そうで良いな! (結局別 platform のために必要になるからアレ)

2022-06-15 09:57:12
Tanaka Akira @tanaka_akr

@kazuho @_ko1 @hnakamur2 ビットフラグというのが気になった。たぶんsingal handlerでビットフラグを立てて、pipeはブロックしているのを起こすためだけに使う、という話と思うんだけど、ビットフラグだと1ビット書き込むのに、1バイト (ワード?) の読み込みと書き込みが必要でアトミックでなく、そこで他のシグナルが...

2022-06-15 10:01:11
Kazuho Oku @kazuho

@tanaka_akr @_ko1 @hnakamur2 はい。アーキテクチャにより工夫(e.g., cmpxchg なり ld-sc なり)は必要になると思います

2022-06-15 10:03:52
Tanaka Akira @tanaka_akr

@kazuho @_ko1 @hnakamur2 ビットフラグじゃなくて、1種類の signal にひとつの volatile な変数を割り当てるのではうまくいかないでしょうか... と思ったのですが、ブロックしている側がクリアするところとレースコンディションになるからダメか

2022-06-15 10:07:12
1 ・・ 4 次へ