int sigvec(int sig, struct sigvec *vec, struct sigvec *ovec);
int sigmask(int signum);
int sigblock(int mask);
int sigsetmask(int mask);
int siggetmask(void);
glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
関数 sigvec() は、(POSIX の sigaction(2) と同様に) シグナル sig の動作の設定・取得を行う。 vec は、NULL 以外の場合、 sig の新しい動作を定義した sigvec 構造体へのポインタである。 ovec は、NULL 以外の場合、 sig の変更前の動作を返すために使用される sigvec 構造体へのポインタである。 sig の動作を変更せずに現在の動作を取得するためには、 vec に NULL を指定し、 ovec に NULL でないポインタを指定すればよい。
SIGKILL と SIGSTOP の動作は変更できない。
sigvec 構造体は以下の通りである:
struct sigvec { void (*sv_handler)(); /* Signal disposition */ int sv_mask; /* Signals to be blocked in handler */ int sv_flags; /* Flags */ };sv_handler フィールドはシグナルの動作を指定するもので、 シグナルハンドラ関数のアドレスか、 SIG_DFL と SIG_IGN のいずれかを指定できる。 SIG_DFL はシグナルに適用されるデフォルトの動作を意味し、 SIG_IGN はシグナルを無視することを意味する。
sv_handler にシグナルハンドラのアドレスを指定した場合、 sv_mask はハンドラが実行中にブロックされるべきシグナルのマスクを指定する。 また、ハンドラを起動したシグナル自身はデフォルトでブロックされる。 SIGKILL か SIGSTOP をブロックしようとした場合には、黙って無視される。
sv_handler にシグナルハンドラのアドレスを指定した場合、 sv_flags フィールドはハンドラが呼ばれた際の挙動を制御するフラグを指定する。 このフィールドには、0 か、以下のフラグを 1個以上指定できる:
関数 sigmask() は signum に対する「シグナルマスク」を構成して返す。 例えば、以下のようなコードを使うと、 sigvec() に渡す vec.sv_mask を初期化できる。
vec.sv_mask = sigmask(SIGQUIT) | sigpause(SIGABRT); /* Block SIGQUIT and SIGABRT during handler execution */
sigblock() 関数は、 mask にあるシグナルをプロセスのシグナルマスクに追加し (POSIX の sigprocmask(SIG_BLOCK) と同様)、変更前のプロセスのシグナルマスクを返す。 SIGKILL や SIGSTOP をブロックしようとした場合には、黙って無視される。
sigsetmask() 関数はプロセスのシグナルマスクを mask で指定された値に設定し (POSIX の sigprocmask(SIG_SETMASK) と同様)、変更前のプロセスのシグナルマスクを返す。
siggetmask() 関数はプロセスの現在のシグナルマスクを返す。この関数は sigblock(0) と等価である。
sigblock() と sigsetmask() は変更前のシグナルマスクを返す。
sigmask() 関数は signum のシグナルマスクを返す。
BSD と System V のどちらのシステムでも シグナルを待つために、 sigpause(3) という名前の関数が提供されているが、 この関数の引き数は両方のシステムで異なる。 詳細は sigpause(3) を参照。