<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:信號掩碼

嵌入式Linux:信號掩碼

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

在 Linux 系統中,內核為每一個(gè)進(jìn)程維護了一個(gè)信號掩碼(實(shí)際上是一個(gè)信號集),即一組信號的集合。當進(jìn)程接收到一個(gè)在其信號掩碼中定義的信號時(shí),該信號將被阻塞,而不會(huì )立即傳遞給進(jìn)程進(jìn)行處理。這個(gè)阻塞行為意味著(zhù)信號不會(huì )被丟棄,而是會(huì )被保留,直到該信號從信號掩碼中移除,內核才會(huì )將其傳遞給進(jìn)程進(jìn)行處理。

向信號掩碼中添加信號的三種方式:

  • 通過(guò) signal() 或 sigaction() 函數: 當應用程序調用 signal() 或 sigaction() 函數為某一信號設置處理方式時(shí),該信號通常會(huì )自動(dòng)添加到進(jìn)程的信號掩碼中。

    這樣做的目的是確保在處理某個(gè)信號時(shí),如果該信號再次發(fā)生,它將被阻塞,以避免信號處理函數的重入問(wèn)題。

    • 對于 sigaction() 函數來(lái)說(shuō),是否自動(dòng)將信號添加到信號掩碼中,還取決于是否設置了 SA_NODEFER 標志。

      如果設置了 SA_NODEFER,信號將不會(huì )被自動(dòng)阻塞。

    • 當信號處理函數執行完畢并返回后,該信號將自動(dòng)從信號掩碼中移除,允許其再次傳遞。

  • 通過(guò) sigaction() 的 sa_mask 參數: 使用 sigaction() 為信號設置處理方式時(shí),還可以通過(guò) sa_mask 參數指定一組額外的信號。

    這些信號將在調用信號處理函數時(shí)被自動(dòng)添加到信號掩碼中,并在處理函數結束后移除。

    這種方式允許在處理某一信號時(shí),臨時(shí)阻塞其他相關(guān)的信號,以避免干擾。

  • 通過(guò) sigprocmask() 系統調用: 除了上述兩種方法,Linux 系統還提供了 sigprocmask() 系統調用,允許程序員在任何時(shí)候顯式地向信號掩碼中添加或移除信號。

    這種方法非常靈活,適用于需要精細控制信號屏蔽行為的場(chǎng)景。


本篇文章主要介紹sigprocmask() 函數向信號掩碼中添加信號的方式。


sigprocmask() 的函數原型如下:


#include <signal.h>int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);


  • how: 這個(gè)參數指定了對信號掩碼的操作行為,有以下三種可能的值:

    • SIG_BLOCK:

      將 set 所指向的信號集中的所有信號添加到當前的信號掩碼中(即將信號掩碼設置為當前掩碼與 set 的并集)。

    • SIG_UNBLOCK:

      從當前信號掩碼中移除 set 所指向的信號集中的所有信號。

    • SIG_SETMASK:

      將當前的信號掩碼直接設置為 set 所指向的信號集。

  • set: 指向一個(gè)信號集,表示需要添加到(或移除自)信號掩碼中的信號。

    如果 set 為 NULL,則不改變當前的信號掩碼。

  • oldset: 如果 oldset 不為 NULL,則在修改信號掩碼之前,會(huì )將當前的信號掩碼保存到 oldset 指向的信號集中。

    這對于需要臨時(shí)修改信號掩碼并在之后恢復原來(lái)狀態(tài)的操作非常有用。

  • 返回值: 如果調用成功,函數返回 0;

    如果失敗,則返回 -1 并設置 errno 來(lái)指示錯誤原因。


以下代碼展示了如何使用 sigprocmask() 將信號 SIGINT 添加到進(jìn)程的信號掩碼中,并在之后將其移除。

#include <stdio.h>#include <signal.h>#include <stdlib.h> int main() {    int ret;    sigset_t sig_set;     // 初始化信號集為空    sigemptyset(&sig_set);        // 向信號集中添加 SIGINT 信號    sigaddset(&sig_set, SIGINT);     // 將 SIGINT 添加到進(jìn)程的信號掩碼中(阻塞 SIGINT)    ret = sigprocmask(SIG_BLOCK, &sig_set, NULL);    if (ret == -1) {        perror("sigprocmask error");        exit(EXIT_FAILURE);    }     printf("SIGINT blockedn");     // 從信號掩碼中移除 SIGINT 信號(解除阻塞)    ret = sigprocmask(SIG_UNBLOCK, &sig_set, NULL);    if (ret == -1) {        perror("sigprocmask error");        exit(EXIT_FAILURE);    }     printf("SIGINT unblockedn");     return 0;}

信號掩碼是 Linux 進(jìn)程信號處理機制中的一個(gè)關(guān)鍵概念。通過(guò) signal()、sigaction() 和 sigprocmask() 等函數,程序可以精確控制哪些信號應該被阻塞、哪些信號應該被傳遞。理解和靈活運用這些函數,可以幫助開(kāi)發(fā)人員編寫(xiě)更加健壯的信號處理代碼,避免信號干擾導致的潛在問(wèn)題。

*博客內容為網(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>