中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. "); //-->

        博客專欄

        EEPW首頁 > 博客 > 嵌入式Linux:信號掩碼

        嵌入式Linux:信號掩碼

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

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

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

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

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

          • 對于 sigaction() 函數(shù)來說,是否自動將信號添加到信號掩碼中,還取決于是否設(shè)置了 SA_NODEFER 標(biāo)志。

            如果設(shè)置了 SA_NODEFER,信號將不會被自動阻塞。

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

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

          這些信號將在調(diào)用信號處理函數(shù)時被自動添加到信號掩碼中,并在處理函數(shù)結(jié)束后移除。

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

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

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


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


        sigprocmask() 的函數(shù)原型如下:


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


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

          • SIG_BLOCK:

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

          • SIG_UNBLOCK:

            從當(dāng)前信號掩碼中移除 set 所指向的信號集中的所有信號。

          • SIG_SETMASK:

            將當(dāng)前的信號掩碼直接設(shè)置為 set 所指向的信號集。

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

          如果 set 為 NULL,則不改變當(dāng)前的信號掩碼。

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

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

        • 返回值: 如果調(diào)用成功,函數(shù)返回 0;

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


        以下代碼展示了如何使用 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)程信號處理機(jī)制中的一個關(guān)鍵概念。通過 signal()、sigaction() 和 sigprocmask() 等函數(shù),程序可以精確控制哪些信號應(yīng)該被阻塞、哪些信號應(yīng)該被傳遞。理解和靈活運用這些函數(shù),可以幫助開發(fā)人員編寫更加健壯的信號處理代碼,避免信號干擾導(dǎo)致的潛在問題。

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



        關(guān)鍵詞: 嵌入式 Linux 信號掩碼

        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉