亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

掌握 C++ 信号处理:安全中断管理与优雅程序终止

信号概述

信号是操作系统发送给进程的中断通知,可能导致程序过早终止。在 UNIX、Linux、macOS 或 Windows 系统上,按下 Ctrl+C 即可产生中断信号。

虽然某些信号无法被程序捕获,但 C++ 标准库 <csignal> 定义了一系列可捕获的信号,使程序能根据信号类型采取相应措施。

常见可捕获信号

序号信号与说明
1SIGABRT:程序异常终止,如调用 abort()。
2SIGFPE:算术运算错误,如除零或溢出。
3SIGILL:检测到非法指令。
4SIGINT:接收到交互式注意信号(通常为 Ctrl+C)。
5SIGSEGV:非法内存访问(段错误)。
6SIGTERM:发送给程序的终止请求。

signal() 函数

C++ 信号处理库提供 signal() 函数用于捕获异常事件,其声明如下:

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

简化理解:该函数接受两个参数——信号编号(整数)和指向信号处理函数的指针。

示例:捕获 SIGINT 信号

#include <iostream>
#include <csignal>
#include <unistd.h>

using namespace std;

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

int main() {
    // 注册 SIGINT 信号及其处理函数
    signal(SIGINT, signalHandler);

    while (true) {
        cout << "Going to sleep...." << endl;
        sleep(1);
    }
    return 0;
}

编译运行后,程序会周期性输出 "Going to sleep...."。按下 Ctrl+C 时,程序捕获信号并输出:

Going to sleep....
Going to sleep....
Going to sleep....
Interrupt signal (2) received.

raise() 函数

程序可通过 raise() 函数主动发送信号,语法如下:

int raise(int sig);

参数 sig 为信号编号,可发送 SIGINT、SIGABRT、SIGFPE、SIGILL、SIGSEGV、SIGTERM、SIGHUP 等信号。

示例:内部触发 SIGINT

#include <iostream>
#include <csignal>
#include <unistd.h>

using namespace std;

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

int main() {
    int i = 0;
    signal(SIGINT, signalHandler);

    while (++i) {
        cout << "Going to sleep...." << endl;
        if (i == 3) {
            raise(SIGINT);  // 主动触发信号
        }
        sleep(1);
    }
    return 0;
}

程序运行到第 3 次循环时自动触发信号并退出:

Going to sleep....
Going to sleep....
Going to sleep....
Interrupt signal (2) received.

最佳实践建议

C语言

  1. 深入理解 C++ 数据类型:基础类型、修饰符与最佳实践
  2. 掌握 C++ 运算符:六大类型全解析与实战示例
  3. C++ 注释最佳实践:编写可读、可维护代码的注释艺术
  4. C++ 类模板实战指南:编写灵活的类型无关代码
  5. C语言文件处理完全指南:fopen、fprintf、fread 与 fseek
  6. C++ 异常处理实战:try、catch、throw 完整指南与示例
  7. C 语言错误处理最佳实践:errno、perror 与 strerror 详解
  8. C++编程语言:核心特性全景解析
  9. C++常量与字面量完全手册:类型、语法与最佳实践
  10. C++运算符大全:算术/关系/逻辑/位/赋值/杂项与优先级结合性
  11. C++数值类型实战指南:基本类型、数学函数与随机数生成
  12. C++引用详解:核心概念、与指针三大差异及函数参数/返回值应用