標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
POSIX.1 |
両方 | 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 が戻されます。
⁄* 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