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()関数の構文です.
この関数は2つのパラメータを受信します.
最初のパラメータは整数であり、信号の番号を表す.
2番目のパラメータは、信号処理関数を指すポインタです.
signal()関数を用いてSIGINT信号をキャプチャする簡単なC++プログラムを作成しましょう.プログラムでどの信号をキャプチャするかにかかわらず、signal関数を使用して信号を登録し、信号ハンドラに関連付ける必要があります.次の例を参照してください.
≪インスタンス|Instance|emdw≫
上記のコードがコンパイルおよび実行されると、次の結果が得られます.
Ctrl+Cを押してプログラムを中断すると、プログラムキャプチャ信号が表示され、プログラムは次のように印刷され、終了します.
raise()関数
パラメータとして整数信号番号を持つ関数raise()を使用して信号を生成できます.構文は次のとおりです.
ここでsigは、SIGINT、SIGABRT、SIGFPE、SIGILL、SIGSEGV、SIGTERM、SIGHUPを含む送信する信号の番号である.以下にraise()関数を使用して内部生成信号の例を示します.
≪インスタンス|Instance|emdw≫
上記のコードがコンパイルおよび実行されると、次の結果が生成され、自動的に終了します.
信号はオペレーティングシステムからプロセスに伝達される割り込みであり、プログラムが早期に終了します.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.