システムコール実行時にシグナルを受けた際の動作
インタラプトの実装を考えている中で、システムコール実行中でブロックしている際(例えばreadで読み出しを待っている)に、シグナルを受けるとどうなるか調べてみた。
というか、元々はシグナルを受けても、シグナルハンドラ実行後、続きを行うものだと思っていたんだけど、そうではなかったという話。
詳しくは、ここ(Super Technique 講座〜シグナルとコールバック)に良い解説がありますが、概略は以下の通り:
- signal(2)の場合、System V系とBSD系で動作が異なる。System V系ではシステムコールは中断し、errno == EINTRとなる。BSD系では動作を継続する。
- sigaction(2) (POSIXシグナル)では動作を設定できる。デフォルトは中断。
ということのよう。
中断できるのなら、インタラプトをシグナルで実現することで、PARDS内部のセマフォによるブロックだけでなく、他のシステムコールによるブロックも解除できる。素晴らしい。
# というか、システムプログラミングするのなら、これくらい知ってないとダメ?