raise() - シグナルの起動

標準

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

ISO C
XPG4
XPG4.2
C99
Single UNIX Specification、バージョン 3

両方  

形式

#include <signal.h>

int raise(int sig);

機能説明

raise() を発行したプログラムにシグナル sig を送ります。サポートされるシグナルのリストについては、表 1 を参照して ください。

signal() を使用して、raise() の起動時の、シグナルの処理方法を指定 できます。

C++ の場合に限り、signal() および raise() の、try()、catch()、ま たは throw() との使用は未定義です。signal() および raise() の、デストラクターとの使用も未定義です。

POSIX の特殊な動作: raise() に関する POSIX の特殊な動作を利用するには、POSIX ランタイム・オプションを ON に設定する必要があり、MVS™ のバージョンが 4.3 以上であることが必要です。

raise() 関数により、シグナル sig が raise() を発行したプロセスに送信 されます。シグナルがブロックされていない場合には、raise() が戻る前に、送信側に 送達されます。サポートされるシグナルのリストについては、sigaction() 関数の説明の 表 1 を参照してください。

signal() または sigaction() を使用して、raise() の起動時の、シグナルの 処理方法を指定できます。

XPG4.2 の特殊な動作: raise() に関する POSIX の特殊な動作を利用するには、POSIX ランタイム・オプションを ON に設定する必要があり、MVS のバージョンが 4.3 以上であることが必要です。

以下のシグナルの動作に影響を与えるものとして、その他のいくつかの関数を XPG4.2 アプリケーションで使用できます。
  • bsd_signal()
  • sigignore()
  • sigset()

C++ の特殊な動作: シグナル処理と C++ 例外処理が混在している場合は、動作は未定義です。 また、コンストラクターおよびデストラクターでのシグナル処理の使用も未定義です。

使用上の注意

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

戻り値

正常に実行された場合、raise() は 0 を戻します。

正常に実行されなかった場合は、raise() はゼロ以外を戻します。

XPG4 の特殊な動作: raise() 関数は、errno を次のいずれかの値に設定します。
エラー・コード
説明
EINVAL
sig 引数の値が無効シグナル番号です。

CELEBR01
⁄* CELEBR01                                      

   This example establishes a signal handler called sig_hand for the            
   signal SIGUSR1.                                                              
   The signal handler is called whenever the SIGUSR1 signal is raised and       
   will ignore the first nine occurrences of the signal.                        
   On the tenth raised signal, it exits the program with an error code of 10.   
   Note that the signal handler must be reestablished each time it is called.   

 *⁄                                                                             
#include <signal.h>                                                             
#include <stdio.h>                                                              
#include <stdlib.h>                                                             
                                                                                
#ifdef __cplusplus                                                              
extern "C" {                                                                    
#endif                                                                          
 void sig_hand(int);                                                            
#ifdef __cplusplus                                                              
}                                                                               
#endif                                                                          
int i;                                                                          
                                                                                
int main(void)                                                                  
{                                                                               
   signal(SIGUSR1, sig_hand);  ⁄* set up handler for SIGUSR1 *⁄                 
   for (i=0; i<10; ++i)                                                         
      raise(SIGUSR1);             ⁄* signal SIGUSR1 is raised *⁄                
}                            ⁄* sig_hand() is called *⁄                         
                                                                                
void sig_hand(int dummy)                                                        
{                                                                               
   static int count = 0;          ⁄* initialized only once *⁄                   
                                                                                
   count++;                                                                     
   if (count == 10)   ⁄* ignore the first 9 occurrences of this signal *⁄       
   {                                                                            
      printf("reached 10th signal¥n");                                          
      exit(10);                                                                 
   }                                                                            
   else                                                                         
      signal(SIGUSR1, sig_hand);  ⁄* set up the handler again *⁄                
}                                                                               

関連情報