標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
POSIX.1 |
両方 |
#define _OPEN_THREADS
#include <signal.h>
int sigwait(sigset_t *set);
SUSV3:
#define _POSIX_C_SOURCE 200112L
#include <signal.h>
int sigwait(const sigset_t *__restrict__ set, int *__restrict__ sig);
保留シグナルを set から選択し、自動的にこれを保留シグナルのシステムのセットから クリアし、そのシグナル番号を戻りコードに戻すことによって、スレッドに非同期シグナル を待機させます。
呼び出しのときに保留のシグナルが set にない場合 には、set 中の 1 つ以上のシグナルが保留 になるまで、スレッドは中断されます。set で定義されるシグナルは、このルーチンの呼び出しの 間、非ブロック化でき、その他の一部のスレッドが 現在これらのシグナルを待機中でない場合には、スレッドが 呼び出しから戻るときにブロックされます。
複数のスレッドでこのルーチンが使用され、同一のシグナル が待機されている場合には、これらのスレッドの 1 つだけが シグナル番号と共にこのルーチンから戻されます。
SUSV3 の特殊な動作: sigwait() 関数は、保留シグナルを set から選択し、自動的にこれを保留シグナルのシステムのセットから クリアし、そのシグナル番号を sig が指す場所に戻します。
引数 | 説明 |
---|---|
sig | シグナル番号を保管する場所のロケーション参照 |
この関数では、SIGTHSTOP および SIGTHCONT シグナルの使用はサポートされていません。
正常に実行された場合、sigwait() はシグナル番号を戻します。
SUSV3 の特殊な動作: 正常に実行された場合、sigwait() は、sig が指す場所に受信したシグナルのシグナル番号を保管し、ゼロを戻します。正常に実行されなかった場合、エラーを示すエラー番号を戻します。
⁄* CELEBS26 *⁄
#define _OPEN_THREADS
#include <stdio.h>
#include <errno.h>
#include <signal.h>
#include <pthread.h>
#include <unistd.h>
void *threadfunc(void *parm)
{
int threadnum;
int *tnum;
sigset_t set;
tnum = parm;
threadnum = *tnum;
printf("Thread %d executing¥n", threadnum);
sigemptyset(&set);
if(sigaddset(&set, SIGUSR1) == -1) {
perror("Sigaddset error");
pthread_exit((void *)1);
}
if(sigwait(&set) != SIGUSR1) {
perror("Sigwait error");
pthread_exit((void *)2);
}
pthread_exit((void *)0);
}
main() {
int status;
int threadparm = 1;
pthread_t threadid;
int thread_stat;
status = pthread_create( &threadid, NULL,
threadfunc,
(void *)&threadparm);
if ( status < 0) {
perror("pthread_create failed");
exit(1);
}
sleep(5);
status = pthread_kill( threadid, SIGUSR1);
if ( status < 0)
perror("pthread_kill failed");
status = pthread_join( threadid, (void *)&thread_stat);
if ( status < 0)
perror("pthread_join failed");
exit(0);
}
CELEBP73
⁄* CELEBS73
This example demonstrates the use of the sigwait() function.
The program will wait until a SIGINT signal is received from the
command line.
Expected output:
SIGINT was received
*⁄
#define _POSIX_C_SOURCE 200112L
#include <signal.h>
#include <stdio.h>
#include <errno.h>
void main() {
sigset_t set;
int sig;
int *sigptr = &sig;
int ret_val;
sigemptyset(&set);
sigaddset(&set, SIGINT);
sigprocmask( SIG_BLOCK, &set, NULL );
printf("Waiting for a SIGINT signal¥n");
ret_val = sigwait(&set,sigptr);
if(ret_val == -1)
perror("sigwait failed¥n");
else {
if(*sigptr == 2)
printf("SIGINT was received¥n");
else
printf("sigwait returned with sig: %d¥n", *sigptr);
}
}