C++信号处理 [ signal()函数 & raise()函数 ]

signal()函数

C++信号处理库提供了 signal 函数,用来捕获突发事件。以下是 signal() 函数的语法:

void (*signal (int sig, void (*func)(int)))(int);

这个函数接收两个参数:第一个参数是一个整数,代表了信号的编号;第二个参数是一个指向信号处理函数的指针。

不管你想在程序中捕获什么信号,都必须使用 signal 函数来注册信号,并将其与信号处理程序相关联。下面是一个使用signal()函数捕获 SIGINT信号的例子。

#include 
#include 
#include 

using namespace std;

void signalHandler( int signum )
{
	cout << "Interrupt signal (" << signum << ") received.\n";
	
	//清理并关闭
	//终止程序
	
	exit(signum); 
}

int main()
{
	//注册信号 SIGINT 和信号处理程序
	signal(SIGINT, signalHandler);
	
	while(1){
		cout << "Going to sleep..." << endl;
		sleep(1);
	} 
	
	return 0;
}

结果如下:

C++信号处理 [ signal()函数 & raise()函数 ]_第1张图片

当按 Ctrl +C 来中断程序,程序会捕获信号,打印如下内容并退出:

C++信号处理 [ signal()函数 & raise()函数 ]_第2张图片

raise()函数

可以使用函数 raise() 生成信号,该函数带有一个整数信号编号作为参数,语法如下:

int raise (signal sig);

在这里,sig是要发送信号的编号,这些信号包括:SIGINT、SIGABRT、SIGFPE、SIGILL、SIGSEGV、SIGTERM、SIGHUP。下面是使用 raise() 函数内部生成信号的实例:

#include 
#include 
#include 

using namespace std;

void signalHandler( int signum )
{
	cout << "Interrupt signal (" << signum << ") received.\n";
	
	// 清理并关闭
	//  终止程序
	
	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;
}

结果如图:

C++信号处理 [ signal()函数 & raise()函数 ]_第3张图片

你可能感兴趣的:(C++信号处理 [ signal()函数 & raise()函数 ])