"); //-->
非實(shí)時(shí)信號(hào)有一個(gè)明顯的局限性:當(dāng)同一個(gè)信號(hào)多次發(fā)生時(shí),它只會(huì)被記錄為一次,且不會(huì)記錄發(fā)生的次數(shù)。因此,當(dāng)該信號(hào)被解除阻塞后,它僅會(huì)被處理一次。這種行為使得標(biāo)準(zhǔn)信號(hào)在某些應(yīng)用場(chǎng)景下不夠靈活。
相比之下,實(shí)時(shí)信號(hào) 提供了幾個(gè)關(guān)鍵的優(yōu)勢(shì):
信號(hào)范圍擴(kuò)大:標(biāo)準(zhǔn)信號(hào)僅提供 SIGUSR1 和 SIGUSR2 供用戶自定義使用,而實(shí)時(shí)信號(hào)的編號(hào)范圍更大(SIGRTMIN 到 SIGRTMAX,對(duì)應(yīng)編號(hào)范圍 34~64),可以應(yīng)用于更多自定義目的。
隊(duì)列化管理:實(shí)時(shí)信號(hào)采取隊(duì)列化管理,這意味著如果同一個(gè)實(shí)時(shí)信號(hào)多次發(fā)生,內(nèi)核將記錄每次事件并按順序傳遞,而標(biāo)準(zhǔn)信號(hào)只會(huì)傳遞一次。
附帶數(shù)據(jù):實(shí)時(shí)信號(hào)允許攜帶附帶數(shù)據(jù)(可以是整型數(shù)據(jù)或指針),供接收方在信號(hào)處理函數(shù)中使用,這為信號(hào)傳遞帶來(lái)了更大的靈活性。
傳遞順序保證:當(dāng)多個(gè)不同的實(shí)時(shí)信號(hào)處于等待狀態(tài)時(shí),信號(hào)編號(hào)越小的信號(hào)會(huì)優(yōu)先傳遞。如果同一個(gè)信號(hào)多次發(fā)生,傳遞順序會(huì)與發(fā)送順序保持一致。
為了使用實(shí)時(shí)信號(hào),通常需要滿足以下要求:
發(fā)送實(shí)時(shí)信號(hào):發(fā)送進(jìn)程需要使用 sigqueue() 系統(tǒng)調(diào)用發(fā)送實(shí)時(shí)信號(hào)及其伴隨數(shù)據(jù)。
接收實(shí)時(shí)信號(hào):接收進(jìn)程需要為該信號(hào)設(shè)置信號(hào)處理函數(shù),并在 sigaction 函數(shù)中啟用 SA_SIGINFO 標(biāo)志,以確??梢越邮瞻殡S數(shù)據(jù)。
sigqueue() 的函數(shù)原型如下:
#include <signal.h>int sigqueue(pid_t pid, int sig, const union sigval value);
參數(shù):
pid:接收信號(hào)的進(jìn)程 ID。
sig:需要發(fā)送的信號(hào)編號(hào)。與 kill() 類(lèi)似,也可以將 sig 設(shè)置為 0 來(lái)檢查進(jìn)程是否存在。
value:一個(gè) union sigval 類(lèi)型的值,表示伴隨信號(hào)傳遞的數(shù)據(jù),可以是整型或指針。
返回值:
成功返回 0;
失敗返回 -1,并設(shè)置 errno。
union sigval 是一個(gè)共用體,定義如下:
typedef union sigval { int sival_int; // 整型數(shù)據(jù) void *sival_ptr; // 指針數(shù)據(jù)} sigval_t;1
發(fā)送進(jìn)程
使用 sigqueue() 向另一個(gè)進(jìn)程發(fā)送實(shí)時(shí)信號(hào)及其伴隨數(shù)據(jù)。
#include <stdio.h>#include <stdlib.h>#include <signal.h> int main(int argc, char *argv[]) { union sigval sig_val; int pid, sig; // 檢查參數(shù)個(gè)數(shù) if (argc < 3) { exit(-1); } // 獲取命令行傳遞的參數(shù) pid = atoi(argv[1]); sig = atoi(argv[2]); printf("Sending signal %d to process %d\n", sig, pid); // 發(fā)送信號(hào),附帶整型數(shù)據(jù) sig_val.sival_int = 10; if (sigqueue(pid, sig, sig_val) == -1) { perror("sigqueue error"); exit(-1); } puts("Signal sent successfully!"); return 0;}2
接收進(jìn)程
使用 sigaction() 綁定實(shí)時(shí)信號(hào)處理函數(shù),并接收伴隨數(shù)據(jù)。
#include <stdio.h>#include <stdlib.h>#include <signal.h>#include <unistd.h> static void sig_handler(int sig, siginfo_t *info, void *context) { sigval_t sig_val = info->si_value; printf("Received real-time signal: %d\n", sig); printf("Attached data: %d\n", sig_val.sival_int);} int main(int argc, char *argv[]) { struct sigaction sa = {0}; int sig; // 檢查參數(shù)個(gè)數(shù) if (argc < 2) { exit(-1); } // 獲取命令行傳遞的信號(hào)編號(hào) sig = atoi(argv[1]); // 綁定信號(hào)處理函數(shù) sa.sa_sigaction = sig_handler; sa.sa_flags = SA_SIGINFO; // 啟用 SA_SIGINFO 標(biāo)志,以接收附帶數(shù)據(jù) if (sigaction(sig, &sa, NULL) == -1) { perror("sigaction error"); exit(-1); } // 無(wú)限循環(huán),等待信號(hào) while (1) { sleep(1); } return 0;}標(biāo)準(zhǔn)信號(hào)和實(shí)時(shí)信號(hào)在 Linux 信號(hào)處理機(jī)制中各有優(yōu)劣。標(biāo)準(zhǔn)信號(hào)適用于大多數(shù)常見(jiàn)場(chǎng)景,但其無(wú)法記錄信號(hào)的多次發(fā)生,且缺少附帶數(shù)據(jù)傳遞的能力。而實(shí)時(shí)信號(hào)則提供了更靈活的功能,包括多次傳遞信號(hào)、附帶數(shù)據(jù)和保證傳遞順序。這些特性使得實(shí)時(shí)信號(hào)在高性能和復(fù)雜信號(hào)處理需求下尤為有用。
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。
相關(guān)推薦
未來(lái)傾向于UFS用于高性能嵌入式閃存
華清遠(yuǎn)見(jiàn)嵌入式在線視頻教程——1、走近嵌入式系統(tǒng)
FFT公司9200的板子的資料
嵌入式U盤(pán)讀寫(xiě)器接口技術(shù)和系統(tǒng)設(shè)計(jì)
ARM 開(kāi)發(fā)板使用手冊(cè) 在三星 S3C2410開(kāi)發(fā)板上燒寫(xiě)linux
大家在互相借鑒吧!--嵌入式系統(tǒng)詞匯表
TI將邊緣AI微控制器更深入地融入嵌入式設(shè)計(jì)
LAN91C111型控制器在嵌入式以太網(wǎng)接口中的應(yīng)用
大家在互相借鑒吧!--嵌入式系統(tǒng)詞匯表
linux入門(mén)精華
汽車(chē)存儲(chǔ)器新突破:8nm128Mb嵌入式MRAM的研發(fā)
RK3576 + ROS2 SLAM建圖與導(dǎo)航實(shí)戰(zhàn)
嵌入式系統(tǒng)的實(shí)時(shí)數(shù)據(jù)接口擴(kuò)展
LCD驅(qū)動(dòng)器SD0432與嵌入式系統(tǒng)的接口設(shè)計(jì)
華清遠(yuǎn)見(jiàn)嵌入式在線視頻教程——2、嵌入式系統(tǒng)的選擇與開(kāi)發(fā)
華清遠(yuǎn)見(jiàn)嵌入式在線視頻教程——3、嵌入式Linux開(kāi)發(fā)應(yīng)用介紹
展會(huì)預(yù)告!米爾邀您相約德國(guó)嵌入式展 2026Embedded World
IAR 擴(kuò)展了嵌入式開(kāi)發(fā)平臺(tái),提供 LTS 服務(wù)
華清遠(yuǎn)見(jiàn)嵌入式在線視頻教程——4、基于ARM的嵌入式開(kāi)發(fā)
大家在互相借鑒吧!--嵌入式系統(tǒng)詞匯表
華清遠(yuǎn)見(jiàn)嵌入式在線視頻教程——5、嵌入式Linux移植和u-boot
Linux系統(tǒng)下USB攝像頭驅(qū)動(dòng)開(kāi)發(fā)
U-BOOT 與 MontaVista Linux 的移植
一款用于遠(yuǎn)程嵌入式設(shè)計(jì)的機(jī)器人
從COM到SMARC再到OSM:嵌入式計(jì)算模塊的發(fā)展
[鏈接]Firefox_ 重新發(fā)現(xiàn)網(wǎng)絡(luò)
嵌入式操作系統(tǒng)大比拼
研華模塊化電腦SOM-7583:通過(guò)模塊化架構(gòu)應(yīng)對(duì)人形機(jī)器人應(yīng)用挑戰(zhàn)
大家在互相借鑒吧!--嵌入式系統(tǒng)詞匯表
米爾亮相德國(guó)嵌入式展2026 Embedded World