sigpending() - 保留シグナルの検査

標準

標準/拡張機能 C/C++ 依存項目

POSIX.1
XPG4
XPG4.2
Single UNIX Specification、バージョン 3

両方  

形式

#define _POSIX_SOURCE
#include <signal.h>

int sigpending(sigset_t *set);

機能説明

送達からブロックされ、プロセスについて保留になっている 呼び出しスレッドおよびセットで保留になっているシグナルのセットの共用体を戻します。1 つしかスレッドがないときには、これは呼び出しプロセスの場合 と同一のものです。この情報は、set に保管されたシグナル・セットとして 表されます。set により示されるシグナル・セットの検査の詳細は、sigismember() - シグナルがシグナル・マスク内にあるかどうかのテストを参照してください。

使用上の注意

この関数では、SIGTHSTOP および SIGTHCONT シグナルの使用はサポートされていません。

戻り値

正常に実行された場合、sigpending() は 0 を戻します。

正常に実行されなかった場合、sigpending() は -1 を戻します。

設定される errno 値はありません。

CELEBS22
⁄* 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

関連情報