溫州網(wǎng)站建設前十公司大同優(yōu)化推廣
下面是一個使用C++和POSIX信號處理以及隊列的簡單示例。這個示例展示了如何使用信號處理程序將信號放入隊列中,并在主循環(huán)中處理這些信號。
#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;
}// 主處理函數(shù)
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);// 主線程繼續(xù)運行std::cout << "Press Ctrl+C to send SIGINT or send SIGTERM to terminate." << std::endl;// 等待處理線程結束processor.join();return 0;
}
代碼說明:
信號處理程序:當接收到信號(如SIGINT或SIGTERM)時,信號處理程序會將信號放入一個線程安全的隊列中。
主處理函數(shù):在一個單獨的線程中,主處理函數(shù)定期檢查隊列,并處理所有待處理的信號。
互斥鎖:使用互斥鎖確保對隊列的訪問是線程安全的。
使用方法:
編譯并運行程序。
按 Ctrl+C 或發(fā)送 SIGTERM 信號(例如使用 kill 命令)來觸發(fā)信號處理程序。
這個示例展示了如何有效地使用隊列來處理信號,從而避免在信號處理程序中執(zhí)行復雜的邏輯。如果你有更多問題或需要進一步的信息,請告訴我!