sigprocmask() - スレッドの検査または変更

標準

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

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

両方  

形式

#define _POSIX_SOURCE
#include <signal.h>

int sigprocmask(int option, const sigset_t *__restrict__ new_set,
                sigset_t *__restrict__ old_set);

機能説明

呼び出しスレッドのシグナル・マスクの検査あるいは変更を行うか、または検査と変更を行います。1 つしかスレッドがないときには、これは呼び出しプロセスの場合 と同一のものです。

通常は、sigprocmask(SIG_BLOCK, …, …) は、コードのクリティカル・セクションの間、シグナルをブロックする のに使用されます。コードのクリティカル・セクションの終了で 、sigprocmask(SIG_SETMASK, …, …) が 使用され、sigprocmask(SIG_BLOCK, …, …) による直前の戻り値に、マスクが復元されます。
option
ブロック・シグナルの既存のセットを変更する方法を 示します。以下は、signal.h ヘッダー・ファイルで定義 された option が取る値です。
SIG_BLOCK
現在ブロックされているセットの他に、new_set で 指定されたシグナルのセットをブロックする必要があることを 示します。
SIG_UNBLOCK
new_set で指定されたシグナルのセットをブロック する必要がないことを示します。これらのシグナルは、ブロック中のシグナルの現行セットから 取り外されます。
SIG_SETMASK
new_set で指定されたシグナルのセットで、ブロック中の以前のシグナルのセットを置き換える必要があること を示します。
new_set
ブロックまたは非ブロックする (option の値による) 必要がある新規シグナルを指定するシグナル・セットを示すか、またはオプションが sig_setmask である場合には、新規シグナル・マスクを示します。シグナル・セットについては、sigemptyset() - 全シグナルを除外するためのシグナル・マスクの初期化で説明しています。new_set が NULL ポインターの場合には、ブロック・シグナルは変更されません。sigprocmask() は、現行セットを判別し、この情報を *old_set に戻します。new_set が NULL 以外の場合、option の値は有効ではありません。

new_set が指す新規のシグナル・セットを作成するには、シグナル・セット操作関数 sigemptyset()、sigfillset()、sigaddset()、および sigdelset() を使用する必要があります。

old_set
sigprocmask() がシグナル・セットを保管できるメモリー位置を 指します。new_set が NULL 以外の場合には、old_set は、ブロック中のシグナルの現行セットを戻します。new_set が NULL 以外の場合には、old_set によって 指されたシグナルのセットは、直前のセットです。

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 を戻します。

正常に実行されなかった場合、sigprocmask() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
EINVAL
option には、認識された値がありません。

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

関連情報