SIGINTERRUPT(3)

名称
siginterrupt - シグナルがシステムコールを中断できるようにする

ライブラリ
libc

書式
<signal.h> int siginterrupt(int sig, int flag)

解説
siginterrupt() 関数を使用して、システムコールが指定のシグナルによって割り込まれたときに、 システムコール再開始の動作を変更します。 フラグが偽 (0) の場合、システムコールは、指定のシグナルによって割り込みされ、 しかもデータがまだ転送されていない場合に再開始されます。 システムコールの再開始は、 4.2BSD 以降のデフォルトの動作であり、 FreeBSD での signal(3) のデフォルトの 動作です。

フラグが真 (1) の場合、 システムコールの再開始は無効になります。 システムコールが指定のシグナルによって割り込みされ、 しかもデータが転送されていない場合、 システムコールは -1 で返り、グローバル変数 errno は EINTR に設定されます。 データの転送を開始した中断されたシステムコールは、 実際に転送されたデータの量を返します。 システムコール割り込みは、 4.1BSD と AT&T UNIX システムに見られるシグナルのふるまいです。

新しい 4.2BSD シグナル処理のセマンティクスはどちらにしても変更されていません。 最も注目すべきは、シグナルハンドラは、後続の sigaction(2) 呼び出しによって明示的に変更されるまで、そして sigaction(2) で文書化したようにシグナルマスクが動作するまで、 必ずインストールされたままになることです。 プログラムは、プログラムの実行の間、必要なだけ頻繁に再起動可能な システムコール操作と割り込み可能なシステムコール操作の間で切り替えできます。

シグナルハンドラの実行の間に siginterrupt(3) を呼び出すと、捕捉される次のシグナルで 新しい処置が行われます。

注
このライブラリルーチンは、 4.2BSD では利用できない sigaction(2) システムコールの拡張を使用しています。 ですから、後方互換性が必要な場合、これは使用しないでください。

戻り値

エラー
siginterrupt() 呼び出しは、次の場合に失敗します:

[EINVAL]
    sig は有効なシグナル番号ではありません。

関連項目
sigaction(2), sigblock(2), sigpause(2), sigsetmask(2), signal(3)

歴史
siginterrupt() 関数は 4.3BSD で登場しました。