C++信号処理

2947 ワード

変換元:https://www.runoob.com/cplusplus/cpp-signal-handling.html
 
信号はオペレーティングシステムからプロセスに伝達される割り込みであり、プログラムが早期に終了します.UNIX、LINUX、Mac OS XまたはWindowsシステムでは、Ctrl+Cを押すことで割り込みが発生します.
一部の信号はプログラムによってキャプチャできないが、下表に示す信号はプログラムでキャプチャでき、信号に基づいて適切な動作をとることができる.これらの信号はC++ヘッダファイルに定義されています.
しんごう
説明
SIGABRT
abortを呼び出すなど、プログラムの異常終了.
SIGFPE
ゼロで割ったり、オーバーフローを起こしたりする操作など、誤った算術演算.
SIGILL
不正な命令を検出します.
SIGINT
インタラクション注意信号が受信された.interrupt,割り込み
SIGSEGV
メモリに不正アクセス.
SIGTERM
プログラムに送信された終了要求.terminate,終了
Signal()関数
C++信号処理ライブラリは、バーストイベントをキャプチャするためのsignal関数を提供する.以下はsignal()関数の構文です.
void (*signal (int sig, void (*func)(int)))(int); 

この関数は2つのパラメータを受信します.
最初のパラメータは整数であり、信号の番号を表す.
2番目のパラメータは、信号処理関数を指すポインタです.
signal()関数を用いてSIGINT信号をキャプチャする簡単なC++プログラムを作成しましょう.プログラムでどの信号をキャプチャするかにかかわらず、signal関数を使用して信号を登録し、信号ハンドラに関連付ける必要があります.次の例を参照してください.
≪インスタンス|Instance|emdw≫
#include  
#include  
#include  
using namespace std; 

void signalHandler( int signum )
{ 
    cout << "Interrupt signal (" << signum << ") received.
"; // // exit(signum); } int main () { // SIGINT signal(SIGINT, signalHandler); while(1) { cout << "Going to sleep...." << endl; sleep(1); } return 0; }

上記のコードがコンパイルおよび実行されると、次の結果が得られます.
Going to sleep....
Going to sleep....
Going to sleep....

Ctrl+Cを押してプログラムを中断すると、プログラムキャプチャ信号が表示され、プログラムは次のように印刷され、終了します.
Going to sleep....
Going to sleep....
Going to sleep....
Interrupt signal (2) received.

raise()関数
パラメータとして整数信号番号を持つ関数raise()を使用して信号を生成できます.構文は次のとおりです.
int raise (signal sig);

ここでsigは、SIGINT、SIGABRT、SIGFPE、SIGILL、SIGSEGV、SIGTERM、SIGHUPを含む送信する信号の番号である.以下にraise()関数を使用して内部生成信号の例を示します.
≪インスタンス|Instance|emdw≫
#include  
#include  
#include  
using namespace std; 

void signalHandler( int signum )
{ 
    cout << "Interrupt signal (" << signum << ") received.
"; // // exit(signum); } nt main () { int i = 0; // SIGINT signal(SIGINT, signalHandler); while(++i) { cout << "Going to sleep...." << endl; if( i == 3 ) { raise( SIGINT); } sleep(1); } return 0; }

上記のコードがコンパイルおよび実行されると、次の結果が生成され、自動的に終了します.
Going to sleep....
Going to sleep....
Going to sleep....
Interrupt signal (2) received.