"); //-->

狠狠做深爱婷婷久久一区,欧美日韩国内,久久麻豆精品传媒,久久久一区一区二区,色鬼伦理片,99视频精品久久,久久精品国产久久久久久,久久久伦理电影一区二,磁力天堂河北彩花

專欄中心

EEPW首頁 > 專欄 > 嵌入式Linux:信號(hào)掩碼

嵌入式Linux:信號(hào)掩碼

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

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

向信號(hào)掩碼中添加信號(hào)的三種方式:

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

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

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

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

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

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

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

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

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

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


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


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


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


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

    • SIG_BLOCK:

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

    • SIG_UNBLOCK:

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

    • SIG_SETMASK:

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

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

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

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

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

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

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


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

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

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

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

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

相關(guān)推薦

研華模塊化電腦SOM-7583:通過模塊化架構(gòu)應(yīng)對(duì)人形機(jī)器人應(yīng)用挑戰(zhàn)

IAR 擴(kuò)展了嵌入式開發(fā)平臺(tái),提供 LTS 服務(wù)

linux入門精華

展會(huì)預(yù)告!米爾邀您相約德國(guó)嵌入式展 2026Embedded World

RK3576 + ROS2 SLAM建圖與導(dǎo)航實(shí)戰(zhàn)

TI將邊緣AI微控制器更深入地融入嵌入式設(shè)計(jì)

汽車存儲(chǔ)器新突破:8nm128Mb嵌入式MRAM的研發(fā)

一款用于遠(yuǎn)程嵌入式設(shè)計(jì)的機(jī)器人

未來傾向于UFS用于高性能嵌入式閃存

米爾亮相德國(guó)嵌入式展2026 Embedded World

ARM 開發(fā)板使用手冊(cè) 在三星 S3C2410開發(fā)板上燒寫linux

FFT公司9200的板子的資料

從COM到SMARC再到OSM:嵌入式計(jì)算模塊的發(fā)展

U-BOOT 與 MontaVista Linux 的移植

更多 培訓(xùn)課堂
更多 焦點(diǎn)
更多 視頻

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

青海省| 沧源| 云阳县| 巧家县| 桑日县| 大埔县| 太白县| 通渭县| 大石桥市| 迁西县| 改则县| 崇文区| 宁海县| 惠州市| 湘乡市| 祁东县| 盘山县| 满洲里市| 湾仔区| 保靖县| 安图县| 石渠县| 泰宁县| 当雄县| 大厂| 郎溪县| 遂昌县| 枣阳市| 五河县| 绍兴县| 辉南县| 中卫市| 竹溪县| 象山县| 白玉县| 新源县| 鹿邑县| 营山县| 电白县| 淮安市| 个旧市|