書式
#include <signal.h>int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
sigprocmask(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE
説明
sigprocmask() を使うと、呼び出したスレッドのシグナルマスクの取得/変更ができる。 シグナルマスクは、呼び出し元に対して現在配送が禁止されているシグナルの 集合のことである (詳細については signal(7) も参照のこと)。このコールの動作は how の値によって決まる:
- SIG_BLOCK
- 禁止されたシグナルの集合は現在の値と set 引き数を結合したものとなる。
- SIG_UNBLOCK
- 現在禁止されているシグナルの集合から set にあるシグナルを取り除く。禁止されていないシグナルを取り除こうと することも認められている。
- SIG_SETMASK
- 禁止されているシグナルの集合に set 引き数を設定する。
oldset が NULL でなければ、シグナルマスクの今までの値を oldset に格納する。
set が NULL であれば、シグナルマスクは変更されない (すなわち、 how は無視される)。 set の値にかかわらず、現在のシグナルマスクの値は oldset に入れて返される (但し、 oldset が NULL でない場合)。
マルチスレッドのプロセスで sigprocmask() を使用した場合の動作は規定されていない。 pthread_sigmask(3) を参照のこと。
返り値
sigprocmask() は成功した場合 0 を返す。 エラーの場合、 -1 を返し、 errno にエラーの原因を示す値を設定する。エラー
- EFAULT
- 引き数 set か oldset がプロセスに割り当てられたアドレス空間の外を指している。
- EINVAL
- how に指定された値が有効ではない。
準拠
POSIX.1-2001.注意
SIGKILL や SIGSTOP を禁止することはできない。 禁止しようとしても黙って無視される。プロセス内の各スレッドはそれぞれ専用のシグナルマスクを持つ。
fork(2) 経由で作成された子プロセスは親プロセスのシグナルマスクのコピーを継承する。 execve(2) の前後でシグナルマスクは保持される。
シグナル SIGBUS, SIGFPE, SIGILL, SIGSEGV が禁止されている間に生成された場合で、 そのシグナルが kill(2), sigqueue(3), raise(3) によって生成されたものでないときには、 その後の動作は未定義である。
シグナル集合の操作に関する詳細は sigsetops(3) を参照のこと。
この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.65 の一部である。 プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。