当前位置: 首页 > article >正文

信号处理以及队列

下面是一个使用C++和POSIX信号处理以及队列的简单示例。这个示例展示了如何使用信号处理程序将信号放入队列中,并在主循环中处理这些信号。

#include <iostream>
#include <csignal>
#include <queue>
#include <mutex>
#include <thread>
#include <chrono>

std::queue<int> signalQueue; // 信号队列
std::mutex queueMutex; // 互斥锁,用于保护队列

// 信号处理程序
void signalHandler(int signal) {
   std::lock_guard<std::mutex> lock(queueMutex); // 锁定队列
   signalQueue.push(signal); // 将信号放入队列
   std::cout << "Signal " << signal << " received and added to queue." << std::endl;
}

// 主处理函数
void processSignals() {
   while (true) {
       std::this_thread::sleep_for(std::chrono::seconds(1)); // 模拟处理间隔

       std::lock_guard<std::mutex> lock(queueMutex); // 锁定队列
       while (!signalQueue.empty()) {
           int signal = signalQueue.front(); // 获取队列前端信号
           signalQueue.pop(); // 移除信号
           std::cout << "Processing signal: " << signal << std::endl;
       }
   }
}

int main() {
   // 注册信号处理程序
   std::signal(SIGINT, signalHandler); // 处理Ctrl+C信号
   std::signal(SIGTERM, signalHandler); // 处理终止信号

   // 启动信号处理线程
   std::thread processor(processSignals);

   // 主线程继续运行
   std::cout << "Press Ctrl+C to send SIGINT or send SIGTERM to terminate." << std::endl;

   // 等待处理线程结束
   processor.join();

   return 0;
}


代码说明:
信号处理程序:当接收到信号(如SIGINT或SIGTERM)时,信号处理程序会将信号放入一个线程安全的队列中。
主处理函数:在一个单独的线程中,主处理函数定期检查队列,并处理所有待处理的信号。
互斥锁:使用互斥锁确保对队列的访问是线程安全的。
使用方法:
编译并运行程序。
按 Ctrl+C 或发送 SIGTERM 信号(例如使用 kill 命令)来触发信号处理程序。
这个示例展示了如何有效地使用队列来处理信号,从而避免在信号处理程序中执行复杂的逻辑。如果你有更多问题或需要进一步的信息,请告诉我!


http://www.kler.cn/a/526288.html

相关文章:

  • 拦截器快速入门及详解
  • [JavaWeb]搜索表单区域
  • 解码,蓝桥杯2020G
  • Redis学习之哨兵二
  • 再见了流氓软件~~
  • 【Pandas】pandas Series cummax
  • 一文讲解Java中的异常处理机制
  • 变量和简单数据类型(字符串)
  • doris:导入时实现数据转换
  • Java 分布式与微服务架构:现代企业应用开发的新范式
  • JAVASE入门十二脚-IO流charArrayReader,bufferedReader,输入与输出,采集百度网页,分块操作
  • Golang 并发机制-1:Golang并发特性概述
  • 实战:如何快速让新网站被百度收录?
  • 11 Spark面试真题
  • Redis常用命令合集【一】
  • 春节旅游高峰,人力资源如何巧妙应对?‌
  • Python标准库 - os (3) 调度策略、系统信息
  • 数据结构--数组链表
  • 大模型时代下的具身智能
  • 实验五---控制系统的稳定性分析---自动控制原理实验课
  • LabVIEW温度修正部件测试系统
  • 图漾相机——C++语言属性设置
  • Java 知识速记:全面解析 final 关键字
  • Linux《基础指令》
  • 动态规划DP 最长上升子序列模型 登山(题目分析+C++完整代码)
  • RocketMQ实战—2.RocketMQ集群生产部署