C++信号処理

2690 ワード

信号はオペレーティングシステムからプロセスに伝達される割り込みであり、プログラムが早期に終了します.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つのパラメータを受信します.最初のパラメータは整数で、信号の番号を表します.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;
}