システムコール実行時にシグナルを受けた際の動作

インタラプトの実装を考えている中で、システムコール実行中でブロックしている際(例えばreadで読み出しを待っている)に、シグナルを受けるとどうなるか調べてみた。
というか、元々はシグナルを受けても、シグナルハンドラ実行後、続きを行うものだと思っていたんだけど、そうではなかったという話。
詳しくは、ここ(Super Technique 講座〜シグナルとコールバック)に良い解説がありますが、概略は以下の通り:

  • signal(2)の場合、System V系BSD系で動作が異なる。System V系ではシステムコールは中断し、errno == EINTRとなる。BSD系では動作を継続する。
  • sigaction(2) (POSIXシグナル)では動作を設定できる。デフォルトは中断。

ということのよう。
中断できるのなら、インタラプトをシグナルで実現することで、PARDS内部のセマフォによるブロックだけでなく、他のシステムコールによるブロックも解除できる。素晴らしい。

# というか、システムプログラミングするのなら、これくらい知ってないとダメ?