sigsuspend() - マスクの変更とスレッドの中断

標準

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

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

両方

POSIX(ON)

形式

#define _POSIX_SOURCE
#include <signal.h>

int sigsuspend(const sigset_t *mask);

機能説明

スレッドの現行シグナル・マスクを *mask で指定 されたシグナル・セットと置き換えてから、呼び出しスレッドの 実行を中断します。そのアクションがシグナル処理関数の実行か、またはプロセスの 終了のどちらかであるシグナルが送達されるまで、スレッドの 実行は再開されません(シグナル・セットの詳細は、sigemptyset() - 全シグナルを除外するためのシグナル・マスクの初期化で説明されています)。

シグナル・マスクは、ブロックする必要があるシグナルのセットを指示します。このようなシグナルによって、中断された関数が「ウェイクアップ」さ れることはありません。シグナル SIGKILL、SIGSTOP、または SIGTRACE を ブロックまたは無視することはできません。mask 引数で 何が指定されようと、これらはスレッドに送達されます。

着信の非ブロック・シグナルによりスレッドが終了した場合は、sigsuspend() が呼び出し元に戻ることはありません。着信シグナルがシグナル処理関数によって処理され、このシグナル処理関数が戻った後に、sigsuspend() は戻ります。シグナル処理関数でマスクが明示的に変更されたのでなければ、スレッドのシグナル・マスクは、sigsuspend() が呼び出される前に どのようなものにも復元されます。

この関数がサポートされるのは、POSIX プログラムだけです。

使用上の注意

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

戻り値

sigsuspend() が戻る場合は、常に -1 が戻されます。

正常に実行されなかった場合、sigsuspend() は errno を次のいずれかの 値に設定します。
エラー・コード
説明
EINTR
シグナルは受信され、正常に処理されました。

CELEBS25
⁄* CELEBS25

   This example replaces the signal mask and then suspends execution.

 *⁄
#define _POSIX_SOURCE
#include <stdio.h>
#include <signal.h>
#include <time.h>
#include <unistd.h>

void catcher(int signum) {
  switch (signum) {
    case SIGUSR1: puts("catcher caught SIGUSR1");
                  break;
    case SIGUSR2: puts("catcher caught SIGUSR2");
                  break;
    default:      printf("catcher caught unexpected signal %d¥n",
                         signum);
  }
}

main() {
  sigset_t sigset;
  struct sigaction sact;
  time_t   t;

  if (fork() == 0) {
    sleep(10);
    puts("child is sending SIGUSR2 signal - which should be blocked");
    kill(getppid(), SIGUSR2);
    sleep(5);
    puts("child is sending SIGUSR1 signal - which should be caught");
    kill(getppid(), SIGUSR1);
    exit(0);
  }

  sigemptyset(&sact.sa_mask);
  sact.sa_flags = 0;
  sact.sa_handler = catcher;
  if (sigaction(SIGUSR1, &sact, NULL) != 0)
    perror("1st sigaction() error");

  else if (sigaction(SIGUSR2, &sact, NULL) != 0)
    perror("2nd sigaction() error");

  else {
    sigfillset(&sigset);
    sigdelset(&sigset, SIGUSR1);
    time(&t);
    printf("parent is waiting for child to send SIGUSR1 at %s",
         ctime(&t));
    if (sigsuspend(&sigset) == -1)
      perror("sigsuspend() returned -1 as expected");
    time(&t);
    printf("sigsuspend is over at %s", ctime(&t));
  }
}
出力:
parent is waiting for child to send SIGUSR1 at Fri Jun 16 12:30:57 2006
child is sending SIGUSR2 signal - which should be blocked
child is sending SIGUSR1 signal - which should be caught
catcher caught SIGUSR2
catcher caught SIGUSR1
sigsuspend() returned -1 as expected: Interrupted function call
sigsuspend is over at Fri Jun 16 12:31:12 2006

関連情報