siginterrupt()
関数を使用して、システムコールが指定のシグナルによって割り込まれたときに、
システムコール再開始の動作を変更します。
フラグが偽 (0) の場合、システムコールは、指定のシグナルによって割り込みされ、
しかもデータがまだ転送されていない場合に再開始されます。
システムコールの再開始は、
BSD 4.2
以降のデフォルトの動作であり、
FreeBSD
での
signal(3)
のデフォルトの
動作です。
フラグが真 (1) の場合、
システムコールの再開始は無効になります。
システムコールが指定のシグナルによって割り込みされ、
しかもデータが転送されていない場合、
システムコールは -1 で返り、グローバル変数
errno
は
EINTR
に設定されます。
データの転送を開始した中断されたシステムコールは、
実際に転送されたデータの量を返します。
システムコール割り込みは、
BSD 4.1
と
AT&T V
システムに見られるシグナルのふるまいです。
新しい
BSD 4.2
シグナル処理のセマンティクスはどちらにしても変更されていません。
最も注目すべきは、シグナルハンドラは、後続の
sigaction(2)
呼び出しによって明示的に変更されるまで、そして
sigaction(2)
で文書化したようにシグナルマスクが動作するまで、
必ずインストールされたままになることです。
プログラムは、プログラムの実行の間、必要なだけ頻繁に再起動可能な
システムコール操作と割り込み可能なシステムコール操作の間で切り替えできます。
シグナルハンドラの実行の間に
siginterrupt(3)
を呼び出すと、捕捉される次のシグナルで
新しい処置が行われます。