1.3.07_C++信号処理
2642 ワード
信号はオペレーティングシステムからプロセスに伝達される割り込みであり、プログラムが早期に終了します.
UNIX、LINUX、Mac OS XまたはWindowsシステムでは、Ctrl+Cを押すことで割り込みが発生します.
一部の信号はプログラムによってキャプチャできないが、下表に示す信号はプログラムでキャプチャでき、信号に基づいて適切な動作をとることができる.これらの信号はC++ヘッダファイルに定義されています.
信号|記述--|SIGABRT|プログラムの異常終了、例えばabortを呼び出す.SIGFPE|誤った演算、例えばゼロで除算したり、オーバーフローを引き起こす操作.SIGILL|不正命令を検出します.SIGINT|は、インタラクション注意信号を受信する.SIGSEGV|メモリへの不正アクセス.SIGTERM|プログラムの終了要求に送信する.
Signal()関数
C++信号処理ライブラリは、バーストイベントをキャプチャするためのsignal関数を提供する.以下はsignal()関数の構文です.
この関数は2つのパラメータを受信します.の最初のパラメータは、信号の番号を表す整数である. の第2のパラメータは、信号処理関数を指すポインタである.
signal()関数を用いてSIGINT信号をキャプチャする簡単なC++プログラムを作成しましょう.プログラムでどの信号をキャプチャするかにかかわらず、signal関数を使用して信号を登録し、信号ハンドラに関連付ける必要があります.次の例を見てみましょう.例
上記のコードがコンパイルおよび実行されると、次の結果が得られます.
Ctrl+Cを押してプログラムを中断すると、プログラムキャプチャ信号が表示され、プログラムは次のように印刷され、終了します.
raise()関数
パラメータとして整数信号番号を持つ関数raise()を使用して信号を生成できます.構文は次のとおりです. sigは、SIGINT、SIGABRT、SIGFPE、SIGILL、SIGSEGV、SIGTERM、SIGHUPを含む送信する信号の番号である.
次にraise()関数を使用して内部生成信号の例を示します.
上記のコードがコンパイルおよび実行されると、次の結果が生成され、自動的に終了します.
コードリンク:https://github.com/karst87/cpp/tree/master/learning/com.runoob
UNIX、LINUX、Mac OS XまたはWindowsシステムでは、Ctrl+Cを押すことで割り込みが発生します.
一部の信号はプログラムによってキャプチャできないが、下表に示す信号はプログラムでキャプチャでき、信号に基づいて適切な動作をとることができる.これらの信号はC++ヘッダファイルに定義されています.
信号|記述--|SIGABRT|プログラムの異常終了、例えばabortを呼び出す.SIGFPE|誤った演算、例えばゼロで除算したり、オーバーフローを引き起こす操作.SIGILL|不正命令を検出します.SIGINT|は、インタラクション注意信号を受信する.SIGSEGV|メモリへの不正アクセス.SIGTERM|プログラムの終了要求に送信する.
Signal()関数
C++信号処理ライブラリは、バーストイベントをキャプチャするためのsignal関数を提供する.以下はsignal()関数の構文です.
void (*signal (int sig, void (*func)(int)))(int);
この関数は2つのパラメータを受信します.
signal()関数を用いてSIGINT信号をキャプチャする簡単なC++プログラムを作成しましょう.プログラムでどの信号をキャプチャするかにかかわらず、signal関数を使用して信号を登録し、信号ハンドラに関連付ける必要があります.次の例を見てみましょう.例
#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);
次にraise()関数を使用して内部生成信号の例を示します.
#include
#include
using namespace std;
void signalHandler( int signum )
{
cout << "Interrupt signal (" << signum << ") received.
";
//
//
exit(signum);
}
int 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.
コードリンク:https://github.com/karst87/cpp/tree/master/learning/com.runoob