sigwait() - 非同期シグナルの待機

標準

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

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

両方  

形式

#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() はシグナル番号を戻します。

正常に実行されなかった場合、sigwait() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
EINVAL
set 引数には、無効またはサポートされていないシグナル番号が入っています。

SUSV3 の特殊な動作: 正常に実行された場合、sigwait() は、sig が指す場所に受信したシグナルのシグナル番号を保管し、ゼロを戻します。正常に実行されなかった場合、エラーを示すエラー番号を戻します。

CELEBS26
⁄* 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);
  }
}

関連情報