<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(zhuān)欄

EEPW首頁(yè) > 博客 > 嵌入式Linux:發(fā)送實(shí)時(shí)信號

嵌入式Linux:發(fā)送實(shí)時(shí)信號

發(fā)布人:美男子玩編程 時(shí)間:2024-10-12 來(lái)源:工程師 發(fā)布文章

非實(shí)時(shí)信號有一個(gè)明顯的局限性:當同一個(gè)信號多次發(fā)生時(shí),它只會(huì )被記錄為一次,且不會(huì )記錄發(fā)生的次數。因此,當該信號被解除阻塞后,它僅會(huì )被處理一次。這種行為使得標準信號在某些應用場(chǎng)景下不夠靈活。

相比之下,實(shí)時(shí)信號 提供了幾個(gè)關(guān)鍵的優(yōu)勢:

  • 信號范圍擴大:標準信號僅提供 SIGUSR1 和 SIGUSR2 供用戶(hù)自定義使用,而實(shí)時(shí)信號的編號范圍更大(SIGRTMIN 到 SIGRTMAX,對應編號范圍 34~64),可以應用于更多自定義目的。

  • 隊列化管理:實(shí)時(shí)信號采取隊列化管理,這意味著(zhù)如果同一個(gè)實(shí)時(shí)信號多次發(fā)生,內核將記錄每次事件并按順序傳遞,而標準信號只會(huì )傳遞一次。

  • 附帶數據:實(shí)時(shí)信號允許攜帶附帶數據(可以是整型數據或指針),供接收方在信號處理函數中使用,這為信號傳遞帶來(lái)了更大的靈活性。

  • 傳遞順序保證:當多個(gè)不同的實(shí)時(shí)信號處于等待狀態(tài)時(shí),信號編號越小的信號會(huì )優(yōu)先傳遞。如果同一個(gè)信號多次發(fā)生,傳遞順序會(huì )與發(fā)送順序保持一致。


為了使用實(shí)時(shí)信號,通常需要滿(mǎn)足以下要求:

  • 發(fā)送實(shí)時(shí)信號:發(fā)送進(jìn)程需要使用 sigqueue() 系統調用發(fā)送實(shí)時(shí)信號及其伴隨數據。

  • 接收實(shí)時(shí)信號:接收進(jìn)程需要為該信號設置信號處理函數,并在 sigaction 函數中啟用 SA_SIGINFO 標志,以確??梢越邮瞻殡S數據。


sigqueue() 的函數原型如下:


#include <signal.h>int sigqueue(pid_t pid, int sig, const union sigval value);


  • 參數:

    • pid:接收信號的進(jìn)程 ID。

    • sig:需要發(fā)送的信號編號。與 kill() 類(lèi)似,也可以將 sig 設置為 0 來(lái)檢查進(jìn)程是否存在。

    • value:一個(gè) union sigval 類(lèi)型的值,表示伴隨信號傳遞的數據,可以是整型或指針。

  • 返回值:

    • 成功返回 0;

    • 失敗返回 -1,并設置 errno。


union sigval 是一個(gè)共用體,定義如下:


typedef union sigval {    int sival_int;    // 整型數據    void *sival_ptr;  // 指針數據} sigval_t;

1


發(fā)送進(jìn)程

使用 sigqueue() 向另一個(gè)進(jìn)程發(fā)送實(shí)時(shí)信號及其伴隨數據。

#include <stdio.h>#include <stdlib.h>#include <signal.h> int main(int argc, char *argv[]) {    union sigval sig_val;    int pid, sig;        // 檢查參數個(gè)數    if (argc < 3) {        exit(-1);    }        // 獲取命令行傳遞的參數    pid = atoi(argv[1]);    sig = atoi(argv[2]);        printf("Sending signal %d to process %d\n", sig, pid);        // 發(fā)送信號,附帶整型數據    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í)信號處理函數,并接收伴隨數據。


#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;        // 檢查參數個(gè)數    if (argc < 2) {        exit(-1);    }        // 獲取命令行傳遞的信號編號    sig = atoi(argv[1]);        // 綁定信號處理函數    sa.sa_sigaction = sig_handler;    sa.sa_flags = SA_SIGINFO;  // 啟用 SA_SIGINFO 標志,以接收附帶數據        if (sigaction(sig, &sa, NULL) == -1) {        perror("sigaction error");        exit(-1);    }        // 無(wú)限循環(huán),等待信號    while (1) {        sleep(1);    }        return 0;}


標準信號和實(shí)時(shí)信號在 Linux 信號處理機制中各有優(yōu)劣。標準信號適用于大多數常見(jiàn)場(chǎng)景,但其無(wú)法記錄信號的多次發(fā)生,且缺少附帶數據傳遞的能力。而實(shí)時(shí)信號則提供了更靈活的功能,包括多次傳遞信號、附帶數據和保證傳遞順序。這些特性使得實(shí)時(shí)信號在高性能和復雜信號處理需求下尤為有用。

*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。



關(guān)鍵詞: 嵌入式 Linux

相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>