C++信号処理
2690 ワード
信号はオペレーティングシステムからプロセスに伝達される割り込みであり、プログラムが早期に終了します.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()関数を使用して内部生成信号の例を示します.
一部の信号はプログラムによってキャプチャできないが、下表に示す信号はプログラムでキャプチャでき、信号に基づいて適切な動作をとることができる.これらの信号はC++ヘッダファイル
しんごう
説明
SIGABRT
abortを呼び出すなど、プログラムの異常終了.
SIGFPE
ゼロで割ったり、オーバーフローを起こしたりする操作など、誤った算術演算.
SIGILL
不正な命令を検出します.
SIGINT
インタラクション注意信号が受信された.
SIGSEGV
メモリに不正アクセス.
SIGTERM
プログラムに送信された終了要求.
Signal()関数
C++信号処理ライブラリは、バーストイベントをキャプチャするためのsignal関数を提供する.以下はsignal()関数の構文です.
void (*signal (int sig, void (*func)(int)))(int);
この関数は2つのパラメータを受信します.最初のパラメータは整数で、信号の番号を表します.2番目のパラメータは、信号処理関数を指すポインタです.
Signal()関数を用いてSIGINT信号をキャプチャする簡単なC++プログラムを作成する.プログラムでどの信号をキャプチャするにしてもsignal関数を使用して信号を登録し、信号処理プログラムに関連付けなければならない.
例:
/*signal*/
#include<iostream>
#include<csignal>
#include<windows.h>
using namespace std;
void signalHandle(int signum)
{
cout<<"Interrupt signal("<<signum<<")received";
/* */
exit(signum);
}
int main()
{
//
signal(SIGINT,signalHandle);
while(1)
{
cout<<"hello..."<<endl;
Sleep(1000);// 1s
}
return 0;
}
運転後、Ctrl+Cを押してキャプチャ信号を中断します.
raise()関数
パラメータとして整数信号番号を持つ関数raise()を使用して信号を生成できます.構文は次のとおりです.
int raise (signal sig);
ここでsigは、SIGINT、SIGABRT、SIGFPE、SIGILL、SIGSEGV、SIGTERM、SIGHUPを含む送信する信号の番号である.以下にraise()関数を使用して内部生成信号の例を示します.
/*raise*/
#include<iostream>
#include<csignal>
#include<windows.h>
using namespace std;
void signalHandle(int signum)
{
cout<<"Interrupt signal("<<signum<<")receive"<<endl;
/* */
exit(signum);
}
int main()
{
int i=0;
/* SIGINT */
signal(SIGINT,signalHandle);
while(++i)
{
cout<<"sleep..."<<endl;
if(i==3)
{
raise(SIGINT);
}
Sleep(1000);
}
return 0;
}