sigset - ライブラリコールの説明 - Linux コマンド集 一覧表
名前
sigset, sighold, sigrelse, sigignore - System V 版シグナル API
書式
#define _XOPEN_SOURCE 500
#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
);
説明
これらの関数は、昔ながらの 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) の「エラー」の節を参照。
注意
これらの関数は glibc 2.1 で登場した。
sighandler_t
型は GNU による拡張であり、この man page で
sigset
()のプロトタイプをより読みやすくするために使われているだけである。
関数
sigset
()は信頼性のあるシグナル処理機構を提供する
(
sa_mask
を 0 で
sigaction
()を呼び出したときと同様)。
System V では、関数
signal
()が提供する処理機構は信頼性のないものである
(
sa_mask
を
SA_RESETHAND | SA_NODEFER
として
sigaction
()を呼び出したときと同様)。
BSD では、
signal
()は信頼性のある処理機構を提供する。
POSIX.1-2001 では、
signal
()のこの点は規定しないままとなっている。
さらなる詳細については
signal
(2) を参照。
BSD と System V のどちらのシステムでも
シグナルを待つために、
sigpause
()という名前の関数が提供されているが、
この関数の引き数は両方のシステムで異なる。
詳細は
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
になるべきであるが、実際には
変更前のシグナルの動作が返されることである。
準拠
SVr4, POSIX.1-2001. これらの関数は廃止予定である。新しいプログラムでは使用しないこと。