信号处理以及队列

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

cpp 复制代码
#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 命令)来触发信号处理程序。

这个示例展示了如何有效地使用队列来处理信号,从而避免在信号处理程序中执行复杂的逻辑。如果你有更多问题或需要进一步的信息,请告诉我!

相关推荐
2501_929807253 天前
考研初试专业课140+总分400+重庆邮电大学801信号与系统考研经验重邮,电子信息与通信工程,真题,大纲,参考书,博睿泽信息通信Jenny。
考研·信息与通信·信号处理·通信·电子信息
kyle~3 天前
滤波---指数移动平均法(Exponential Moving Average, EMA)
数学建模·信号处理
hans汉斯9 天前
采煤工作面隐患目标检测中YOLO11与Faster R-CNN的对比研究
人工智能·目标检测·计算机视觉·cnn·信息与通信·信号处理
T.i.s10 天前
电磁波重构心电图中对金标准归一化问题的探讨
信号处理·离散化·归一化
这张生成的图像能检测吗11 天前
(论文速读)TADNet:心磁图信号去噪的时间分解和基于注意力的深度学习
人工智能·深度学习·信号处理·信号去噪
EW Frontier11 天前
【雷达信号处理】5 个阵元追平 16 个阵元:稀疏阵列 STAP 的实测报告【附python+matlab代码】
python·matlab·信号处理·雷达·mimo·稀疏阵列·stap
FPGA-ADDA13 天前
雷通微系统推出RTSD2605:RFSoC + 英伟达GPU一体化信号处理平台
信号处理·fpga·rfsoc·zu47dr·47dr
传感器与混合集成电路16 天前
储气库漏失检测技术解析:分布式光纤如何锁定环空窜漏的精确位置
分布式·数据分析·信号处理
加油码16 天前
探秘 volatile关键字:编译器的过度优化
linux·bug·信号处理
m0_5474866617 天前
《现代信号处理教程》 全套PPT课件2026
信号处理