Provided by: manpages-ja-dev_0.5.0.0.20210215+dfsg-1_all
名前
sigset, sighold, sigrelse, sigignore - System V 版シグナル API
書式
#include <signal.h> 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(): _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
説明
これらの関数は、昔ながらの System V 版シグナル API を使用しているプログラム に対して互換性 のあるインターフェースを glibc で提供するものである。 この API は過去のものであり、新しい アプリケーションでは POSIX シグナル API (sigaction(2), sigprocmask(2) など) を使用すべき である。 関数 sigset() はシグナル sig のシグナルハンドラーの動作を変更する。 disp 引き数には、シグ ナルハンドラー関数のアドレスか、 以下の定数のいずれか一つを指定できる。 SIG_DFL sig の動作をデフォルトにリセットする。 SIG_IGN sig を無視する。 SIG_HOLD そのプロセスのシグナルマスクに sig を追加するが、 sig の動作は変更しない。 disp にシグナルハンドラーのアドレスが指定された場合、 シグナルハンドラーの実行中は、そのプ ロセスのシグナルマスクに sig が追加される。 disp に SIG_HOLD 以外の値が指定された場合、 そのプロセスのシグナルマスクから sig が削除さ れる。 シグナル SIGKILL と SIGSTOP に対する動作は変更できない。 関数 sighold() は、呼び出し元プロセスのシグナルマスクに sig を追加する。 関数 sigrelse() は、呼び出し元プロセスのシグナルマスクから sig を削除する。 関数 sigignore() は、 sig の動作を SIG_IGN に設定する。
返り値
sigset() は成功すると、 呼び出し前に sig がブロックされていた場合には SIG_HOLD を返し、 ブロックされていなかった場合には 変更前のそのシグナルの動作を返す。 エラーの場合、 sigset() は -1 を返し、 errno にエラーを示す値をセットする。 但し、以下の「バグ」の節も参 照のこと。 関数 sighold(), sigrelse(), sigignore() は成功すると 0 を返す。エラーの場合、-1 を返し、 errno にエラーを示す値をセットする。
エラー
sigset() に関しては、 sigaction(2) と sigprocmask(2) の「エラー」の節を参照。 sighold() と sigrelse() に関しては、 sigprocmask(2) の「エラー」の節を参照。 sigignore() に関しては、 sigaction(2) の「エラー」の節を参照。
準拠
SVr4, POSIX.1-2001. これらの関数は廃止予定である。新しいプログラムでは使用しないこと。 POSIX.1-2008 は、 sighold(), sigignore(), sigpause(), sigrelse(), sigset() を廃止予定とし ている。 代わりに、 sigaction(2), sigprocmask(2), pthread_sigmask(3), sigsuspend(2) の使 用が推奨されている。
注意
これらの関数は glibc 2.1 で登場した。 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.2 より前のバージョンの glibc では、 disp に SIG_HOLD 以外の値が指定された場合、 sig のブ ロック解除を行っていなかった。 2.3.5 以前の全てのバージョンの glibc では、 sigset() が変更前のシグナルの動作を正しく返さ ない場合が 2つある。 一つめは、 disp に SIG_HOLD が指定されると、成功した場合 sigset() は 常に SIG_HOLD を返すことである。 正しくは、(シグナルがブロックされていなかった場合には) 変更前のシグナルの動作を返すべきである (シグナルがブロックされていた場合には、 SIG_HOLD が 返される)。 もう一つは、シグナルが現在ブロックされている場合には、 成功した場合の sigset() の返り値は SIG_HOLD になるべきであるが、実際には 変更前のシグナルの動作が返されることであ る。 これらの問題は glibc 2.5 以降で修正されている。
関連項目
kill(2), pause(2), sigaction(2), signal(2), sigprocmask(2), raise(3), sigpause(3), sigvec(3), signal(7)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部である。 プロジェクト の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。