C++ 信号处理



信号是由操作系统传递给进程的中断,它可能导致程序过早终止。您可以在 UNIX、LINUX、Mac OS X 或 Windows 系统上按 Ctrl+C 生成中断。

有一些信号程序无法捕获,但以下列出了可以在程序中捕获的信号,并且可以根据信号采取相应的操作。这些信号在 C++ 头文件 <csignal> 中定义。

序号 信号和描述
1

SIGABRT

程序异常终止,例如调用 abort

2

SIGFPE

算术运算错误,例如除以零或导致溢出的运算。

3

SIGILL

检测到非法指令。

4

SIGINT

收到交互式注意信号。

5

SIGSEGV

无效的存储器访问。

6

SIGTERM

发送到程序的终止请求。

signal() 函数

C++ 信号处理库提供函数 signal 来捕获意外事件。以下是 signal() 函数的语法:

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

简单来说,此函数接收两个参数:第一个参数是表示信号编号的整数,第二个参数是指向信号处理函数的指针。

让我们编写一个简单的 C++ 程序,其中我们将使用 signal() 函数捕获 SIGINT 信号。您希望在程序中捕获的任何信号,都必须使用 signal 函数注册该信号并将其与信号处理程序关联。请查看以下示例:

#include <iostream>
#include <csignal>

using namespace std;

void signalHandler( int signum ) {
   cout << "Interrupt signal (" << signum << ") received.\n";

   // cleanup and close up stuff here  
   // terminate program  

   exit(signum);  
}

int main () {
   // register signal SIGINT and signal handler  
   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() 函数内部生成信号的示例:

#include <iostream>
#include <csignal>

using namespace std;

void signalHandler( int signum ) {
   cout << "Interrupt signal (" << signum << ") received.\n";

   // cleanup and close up stuff here  
   // terminate program  

   exit(signum);  
}

int main () {
   int i = 0;
   // register signal SIGINT and signal handler  
   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.
广告