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.41 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man-pages/
に書かれている。