typedef void (*sighandler_t)(int);
sighandler_t sigset(int sig, sighandler_t disp);
int sighold(int sig);
int sigrelse(int sig);
int sigignore(int sig);
glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
sigset(), sighold(), sigrelse(), sigignore():
関数 sigset() はシグナル sig のシグナルハンドラーの動作を変更する。 disp 引数には、シグナルハンドラー関数のアドレスか、 以下の定数のいずれか一つを指定できる。
disp にシグナルハンドラーのアドレスが指定された場合、 シグナルハンドラーの実行中は、そのプロセスのシグナルマスクに sig が追加される。
disp に SIG_HOLD 以外の値が指定された場合、 そのプロセスのシグナルマスクから sig が削除される。
シグナル SIGKILL と SIGSTOP に対する動作は変更できない。
関数 sighold() は、呼び出し元プロセスのシグナルマスクに sig を追加する。
関数 sigrelse() は、呼び出し元プロセスのシグナルマスクから sig を削除する。
関数 sigignore() は、 sig の動作を SIG_IGN に設定する。
関数 sighold(), sigrelse(), sigignore() は成功すると 0 を返す。エラーの場合、-1 を返し、 errno にエラーを示す値をセットする。
sighold() と sigrelse() に関しては、 sigprocmask(2) の「エラー」の節を参照。
sigignore() に関しては、 sigaction(2) の「エラー」の節を参照。
インターフェース | 属性 | 値 |
sigset(),
sighold(),
sigrelse(), sigignore() | Thread safety | MT-Safe |
sighandler_t 型は GNU による拡張であり、この man page で sigset() のプロトタイプをより読みやすくするために使われているだけである。
関数 sigset() は信頼性のあるシグナル処理機構を提供する (sa_mask を 0 で sigaction(2) を呼び出したときと同様)。
System V では、関数 signal() が提供する処理機構は信頼性のないものである (sa_mask を SA_RESETHAND | SA_NODEFER として sigaction(2) を呼び出したときと同様)。 BSD では、 signal() は信頼性のある処理機構を提供する。 POSIX.1-2001 では、 signal() のこの点は規定しないままとなっている。 さらなる詳細については signal(2) を参照。
BSD と System V のどちらのシステムでも シグナルを待つために、 sigpause(3) という名前の関数が提供されているが、 この関数の引数は両方のシステムで異なる。 詳細は sigpause(3) を参照。
2.3.5 以前の全てのバージョンの glibc では、 sigset() が変更前のシグナルの動作を正しく返さない場合が 2つある。 一つめは、 disp に SIG_HOLD が指定されると、成功した場合 sigset() は常に SIG_HOLD を返すことである。 正しくは、(シグナルがブロックされていなかった場合には) 変更前のシグナルの動作を返すべきである (シグナルがブロックされていた場合には、 SIG_HOLD が返される)。 もう一つは、シグナルが現在ブロックされている場合には、 成功した場合の sigset() の返り値は SIG_HOLD になるべきであるが、実際には 変更前のシグナルの動作が返されることである。 これらの問題は glibc 2.5 以降で修正されている。