標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
POSIX.1 |
両方 |
#define _POSIX_SOURCE
#include <signal.h>
int sigpending(sigset_t *set);
送達からブロックされ、プロセスについて保留になっている 呼び出しスレッドおよびセットで保留になっているシグナルのセットの共用体を戻します。1 つしかスレッドがないときには、これは呼び出しプロセスの場合 と同一のものです。この情報は、set に保管されたシグナル・セットとして 表されます。set により示されるシグナル・セットの検査の詳細は、sigismember() - シグナルがシグナル・マスク内にあるかどうかのテストを参照してください。
この関数では、SIGTHSTOP および SIGTHCONT シグナルの使用はサポートされていません。
正常に実行された場合、sigpending() は 0 を戻します。
正常に実行されなかった場合、sigpending() は -1 を戻します。
設定される errno 値はありません。
⁄* CELEBS22
This example returns blocked or pending signals.
*⁄
#define _POSIX_SOURCE
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
void catcher(int signum) {
puts("inside catcher!");
}
void check_pending(int signum, char *signame) {
sigset_t sigset;
if (sigpending(&sigset) != 0)
perror("sigpending() error");
else if (sigismember(&sigset, signum))
printf("a %s signal is pending¥n", signame);
else
printf("no %s signals are pending¥n", signame);
}
main() {
struct sigaction sigact;
sigset_t sigset;
sigemptyset(&sigact.sa_mask);
sigact.sa_flags = 0;
sigact.sa_handler = catcher;
if (sigaction(SIGUSR1, &sigact, NULL) != 0)
perror("sigaction() error");
else {
sigemptyset(&sigset);
sigaddset(&sigset, SIGUSR1);
if (sigprocmask(SIG_SETMASK, &sigset, NULL) != 0)
perror("sigprocmask() error");
else {
puts("SIGUSR1 signals are now blocked");
kill(getpid(), SIGUSR1);
printf("after kill: ");
check_pending(SIGUSR1, "SIGUSR1");
sigemptyset(&sigset);
sigprocmask(SIG_SETMASK, &sigset, NULL);
puts("SIGUSR1 signals are no longer blocked");
check_pending(SIGUSR1, "SIGUSR1");
}
}
}
SIGUSR1 signals are now blocked
after kill: a SIGUSR1 signal is pending
inside catcher!
SIGUSR1 signals are no longer blocked
no SIGUSR1 signals are pending