標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
POSIX.1 |
両方 |
#define _POSIX_SOURCE
#include <signal.h>
int sigprocmask(int option, const sigset_t *__restrict__ new_set,
sigset_t *__restrict__ old_set);
呼び出しスレッドのシグナル・マスクの検査あるいは変更を行うか、または検査と変更を行います。1 つしかスレッドがないときには、これは呼び出しプロセスの場合 と同一のものです。
new_set が指す新規のシグナル・セットを作成するには、シグナル・セット操作関数 sigemptyset()、sigfillset()、sigaddset()、および sigdelset() を使用する必要があります。
sigprocmask() がシグナル・マスクを変更した後に、プロセス・レベルまたは現行スレッドのレベルのどちらかで 保留の非ブロック・シグナルがあると、sigprocmask() が戻る前に、これら のシグナルの少なくとも 1 つがスレッドに送達されます。
シグナル SIGKILL、SIGSTOP、または SIGTRACE はブロックできません。sigprocmask() を使用して、これらのシグナルをブロックしようとしても、無視されます。sigprocmask() は、エラー状況を戻しません。
kill()、killpg()、raise()、sigqueue()、または pthread_kill() によって人為的に 生成されるのではない (つまり、ハードウェアまたはソフトウェア例外の結果として システムで生成された) SIGFPE、SIGILL、および SIGSEGV シグナル は、ブロックされません。
例外によって別のシグナル SIGFPE、SIGILL、または SIGSEGV が発生したとき に、人為的に発生されるシグナル SIGFPE、SIGILL、または SIGSEGV が保留状態で、なおかつブロック化されている場合は、人為的に発生した シグナルと例外により発生したシグナルの両方がアプリケーションに送ら れる場合があります。
sigprocmask() が失敗した場合、スレッドのシグナル・マスクは変更されません。
この関数では、SIGTHSTOP および SIGTHCONT シグナルの使用はサポートされていません。
正常に実行された場合、sigprocmask() は 0 を戻します。
⁄* CELEBS23
This example changes the signal mask.
*⁄
#define _POSIX_SOURCE
#include <signal.h>
#include <stdio.h>
#include <time.h>
#include <unistd.h>
void catcher(int signum) {
puts("inside catcher");
}
main() {
time_t start, finish;
struct sigaction sact;
sigset_t new_set, old_set;
double diff;
sigemptyset(&sact.sa_mask);
sact.sa_flags = 0;
sact.sa_handler = catcher;
if (sigaction(SIGALRM, &sact, NULL) != 0)
perror("sigaction() error");
else {
sigemptyset(&new_set);
sigaddset(&new_set, SIGALRM);
if (sigprocmask(SIG_BLOCK, &new_set, &old_set) != 0)
perror("1st sigprocmask() error");
else {
time(&start);
printf("SIGALRM signals blocked at %s", ctime(&start));
alarm(1);
do {
time(&finish);
diff = difftime(finish, start);
} while (diff < 10);
if (sigprocmask(SIG_SETMASK, &old_set, NULL) != 0)
perror("2nd sigprocmask() error");
else
printf("SIGALRM signals unblocked at %s", ctime(&finish));
}
}
}
SIGALRM signals blocked at Fri Jun 16 12:24:19 2006
inside catcher
SIGALRM signals unblocked at Fri Jun 16 12:24:29 2006