首页 > 后端开发 > C++ > 正文

c++怎么捕获和处理信号_c++信号捕获处理方法

尼克
发布: 2025-10-01 13:41:02
原创
327人浏览过
C++中通过signal或sigaction捕获信号,如SIGINT、SIGTERM,用于处理Ctrl+C或进程终止请求;推荐使用sigaction实现更安全稳定的信号处理,尤其在生产环境中;信号处理函数内需仅调用异步信号安全函数,避免复杂操作,通常设置标志位由主循环处理;注意SIGKILL不可捕获,多线程环境需额外管理信号递送。

c++怎么捕获和处理信号_c++信号捕获处理方法

在C++中,可以通过POSIX标准提供的signal函数或更推荐的sigaction来捕获和处理系统信号。信号是操作系统通知程序发生特定事件的一种机制,比如用户按下Ctrl+C(SIGINT)、程序访问非法内存(SIGSEGV)等。

使用 signal 函数简单捕获信号

signal 是最基础的方式,适合简单的信号处理场景。

示例:捕获 SIGINT(Ctrl+C)

#include <csignal>
#include <iostream>

void signalHandler(int sig) {
  std::cout << "收到信号 " << sig << ",正在退出...\n";
  exit(0);
}

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

  while (true) {
    // 模拟程序运行
  }

  return 0;
}

运行程序后按 Ctrl+C,会调用signalHandler并退出。

使用 sigaction 更安全地处理信号

sigaction 提供了更精确的控制,避免signal在不同系统上的行为不一致问题,是生产环境推荐方式。

Alkaid.art
Alkaid.art

专门为Phtoshop打造的AIGC绘画插件

Alkaid.art 153
查看详情 Alkaid.art

立即学习C++免费学习笔记(深入)”;

示例:用 sigaction 捕获 SIGTERM

#include <csignal>
#include <iostream>
#include <cstdlib>

void signalHandler(int sig) {
  if (sig == SIGTERM) {
    std::cout << "收到终止信号 SIGTERM,清理资源后退出。\n";
    exit(0);
  }
}

int main() {
  struct sigaction sa;
  sa.sa_handler = signalHandler;
  sigemptyset(&sa.sa_mask);
  sa.sa_flags = 0;

  // 设置 SIGTERM 的处理方式
  if (sigaction(SIGTERM, &sa, nullptr) == -1) {
    perror("sigaction 错误");
    return 1;
  }

  std::cout << "等待 SIGTERM 信号... (可用 kill -TERM " << getpid() << " 发送)\n";

  while (true) {
    // 等待信号
  }

  return 0;
}

可另开终端执行:kill -TERM [进程ID] 测试。

常见可捕获信号说明

  • SIGINT:中断信号,通常由 Ctrl+C 触发
  • SIGTERM:终止请求,可被捕获,用于优雅关闭
  • SIGKILL:强制终止,不能被捕获或忽略
  • SIGSEGV:段错误,访问非法内存时触发,可用于调试(但不建议恢复执行)
  • SIGUSR1 / SIGUSR2:用户自定义信号,常用于进程间通信

注意事项与限制

  • 信号处理函数中只能调用异步信号安全函数(如 write、_exit),不能使用 cout、malloc、printf 等
  • 避免在信号处理中做复杂操作,建议只设置标志位,主循环中检查并处理
  • 某些信号如 SIGSEGV 虽可捕获,但继续执行原代码可能导致再次触发
  • 多线程环境下,信号处理更复杂,需指定信号递送到哪个线程

基本上就这些。日常开发中,用sigaction注册SIGINTSIGTERM来实现程序优雅退出是最常见的需求。不复杂但容易忽略的是信号安全函数的限制。

以上就是c++++怎么捕获和处理信号_c++信号捕获处理方法的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号