在C++命令行程序中,当用户在终端按下Ctrl+C,操作系统会向进程发送SIGINT信号,默认动作是立即终止进程。借助C++标准库中的signal函数,我们可以拦截该信号,在程序退出前执行自定义的清理逻辑,例如保存配置、关闭网络连接或释放动态资源。

signal函数基本用法
signal函数定义在<csignal>头文件中,原型为void (*signal(int sig, void (*handler)(int)))(int)。第一个参数是信号编号,第二个参数是处理函数指针或宏SIG_IGN、SIG_DFL。
捕获Ctrl+C示例
下面的代码演示如何捕获SIGINT并打印提示后安全退出:
#include <iostream>
#include <csignal>
#include <unistd.h>
// 自定义信号处理器
void handle_sigint(int sig) {
std::cout << "n收到信号 " << sig << ",正在清理并退出..." << std::endl;
// 这里可以关闭文件、释放内存等
_exit(0);
}
int main() {
// 注册SIGINT(Ctrl+C)处理器
std::signal(SIGINT, handle_sigint);
std::cout << "程序运行中,按Ctrl+C测试信号拦截" << std::endl;
while (true) {
sleep(1); // 模拟工作
}
return 0;
}
使用时的注意事项
- 信号处理器中应只调用异步信号安全函数,例如_write、_exit,避免调用printf等不一定安全的函数。
- 不同平台对signal的语义略有差异,POSIX环境更推荐使用sigaction以获得更可控的行为。
- signal只能设置单一处理器,重复调用会覆盖之前的处理函数。
简单对比signal与sigaction
| 特性 | signal | sigaction |
|---|---|---|
| 可移植性 | 一般 | 较好(POSIX) |
| 行为控制 | 有限 | 精细 |
| 使用难度 | 简单 | 稍复杂 |
小结
通过signal函数拦截Ctrl+C产生的SIGINT信号,能让C++程序在退出前完成必要清理。对于简单工具,signal足够使用;若需要更严谨的并发与信号控制,建议进一步了解sigaction的用法。
C++signalsystem_signal修改时间:2026-07-30 19:27:15