- C++ 基础
- C++ 首页
- C++ 概述
- C++ 环境设置
- C++ 基本语法
- C++ 注释
- C++ Hello World
- C++ 省略命名空间
- C++ 常量/字面量
- C++ 关键字
- C++ 标识符
- C++ 数据类型
- C++ 数值数据类型
- C++ 字符数据类型
- C++ 布尔数据类型
- C++ 变量类型
- C++ 变量作用域
- C++ 多个变量
- C++ 基本输入/输出
- C++ 修饰符类型
- C++ 存储类
- C++ 运算符
- C++ 数字
- C++ 枚举
- C++ 引用
- C++ 日期和时间
- C++ 控制语句
- C++ 决策
- C++ if 语句
- C++ if else 语句
- C++ 嵌套 if 语句
- C++ switch 语句
- C++ 嵌套 switch 语句
- C++ 循环类型
- C++ while 循环
- C++ for 循环
- C++ do while 循环
- C++ foreach 循环
- C++ 嵌套循环
- C++ break 语句
- C++ continue 语句
- C++ goto 语句
- C++ 构造函数
- C++ 构造函数和析构函数
- C++ 复制构造函数
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.
广告