C++通过系统API实现Unix/Linux信号处理,使用signal()或更安全的sigaction()注册处理函数,捕获如SIGINT、SIGTERM等信号,响应中断或终止请求。示例显示按下Ctrl+C触发SIGINT,调用自定义处理函数输出信息并退出;另一示例用sigaction处理SIGTERM,支持可靠信号管理。注意事项包括:仅在信号处理函数中调用异步信号安全函数,避免复杂操作,推荐设置volatile sig_atomic_t标志位,主循环中检查并响应,确保线程与异常安全。合理使用可实现程序优雅关闭与外部命令响应。

在Unix/Linux系统中,信号(Signal)是一种用于进程间通信的机制,常用于通知进程发生了某种事件,比如用户按下Ctrl+C、程序出现段错误、定时器超时等。C++本身没有内置的信号处理机制,但可以借助操作系统提供的API来实现信号的捕获和响应。下面介绍C++在Linux环境下如何处理信号。
signal()函数设置信号处理函数。该函数定义在<signal.h>头文件中。
示例:捕获SIGINT信号(Ctrl+C)
#include <iostream>
#include <csignal>
#include <cstdlib>
void signalHandler(int sig) {
std::cout << "\n接收到信号 " << sig << ",正在退出...\n";
exit(sig);
}
int main() {
// 注册SIGINT信号处理函数
signal(SIGINT, signalHandler);
std::cout << "等待信号(按 Ctrl+C 中断)...\n";
while (true) {
// 模拟工作
}
return 0;
}
signalHandler函数而不是直接终止程序。
signal(),sigaction提供了更精确和可靠的控制,推荐在生产环境中使用。
示例:使用sigaction处理SIGTERM
#include <iostream>
#include <csignal>
#include <cstring>
void signalHandler(int sig) {
if (sig == SIGTERM) {
std::cout << "收到终止请求,清理资源并退出。\n";
}
exit(0);
}
int main() {
struct sigaction sa;
std::memset(&sa, 0, sizeof(sa));
sa.sa_handler = signalHandler;
sigemptyset(&sa.sa_mask); // 不阻塞其他信号
sa.sa_flags = 0;
if (sigaction(SIGTERM, &sa, nullptr) == -1) {
perror("sigaction");
return 1;
}
std::cout << "程序运行中,尝试使用 'kill <pid>' 发送SIGTERM\n";
while (true) {}
return 0;
}
sigaction的优点包括:
write、_exit),不能使用std::cout、malloc、printf等非安全函数推荐做法:在信号处理函数中仅修改一个volatile sig_atomic_t变量,主程序循环中检查该变量。
立即学习“C++免费学习笔记(深入)”;
volatile sig_atomic_t signalReceived = 0;
void signalHandler(int sig) {
signalReceived = sig; // 安全赋值
}
int main() {
signal(SIGINT, signalHandler);
while (!signalReceived) {
// 正常工作
}
std::cout << "程序被信号 " << signalReceived << " 中断\n";
return 0;
}
以上就是C++怎么处理信号(Signal)_C++在Unix/Linux环境下的信号处理与编程的详细内容,更多请关注php中文网其它相关文章!
编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号