开发手册 欢迎您!
软件开发者资料库

C ++信号处理

C ++信号处理 - 从简单和简单的步骤学习C ++,从基本到高级概念,包括C ++概述,环境设置,基本语法,注释,数据类型,变量类型,范围,常量/文字,修饰符类型,存储类,操作符,循环类型,决策,函数,数字,数组,字符串,指针,引用,日期和时间,基本输入/输出,数据结构,类和对象,面向对象语言,方法,覆盖,继承,多态,抽象,封装,接口,文件和流,STL,迭代器,算法,异常处理,动态内存,重载,模板,命名空间和信号处理,预处理器,多线程,Web编程。

信号是操作系统传递给进程的中断,可以提前终止程序.您可以通过在UNIX,LINUX,Mac OS X或Windows系统上按Ctrl + C来生成中断.

有些信号无法被程序捕获,但有以下列表您可以在程序中捕获的信号,并可以根据信号采取适当的措施.这些信号在C ++头文件< csignal>中定义.

Sr.NoSignal&说明
1

SIGABRT

程序异常终止,例如调用中止.

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信号.无论您希望在程序中捕获什么信号,都必须使用信号功能注册该信号,并将其与信号处理程序关联.检查以下示例 :

#include #include 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 #include 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.