Unix/Linux 系統編程中用于管理信號處理行為的核心概念或模型

在 Unix/Linux 系統編程中,管理信號處理行為涉及以下核心概念和模型,它們共同構成了信號處理的框架:


1. 信號(Signal)模型

  • 軟件中斷:信號是異步事件通知機制,類比硬件中斷
  • 預定義類型SIGINT (Ctrl+C)、SIGTERM (終止請求)、SIGSEGV (段錯誤) 等標準信號
  • 生命周期
    1. 生成(Generation):事件觸發信號產生
    2. 遞送(Delivery):內核將信號傳遞給目標進程
    3. 處理(Handling):進程執行注冊的處理動作

2. 信號處理行為控制

行為類型說明設置方式
默認行為系統預定義行為(終止/忽略/暫停)SIG_DFL
忽略信號丟棄信號不做任何響應SIG_IGN
自定義處理函數用戶注冊的信號處理例程函數指針

3. 關鍵控制機制

(1) 信號阻塞(Blocking)
  • 目的:臨時阻止信號遞送
  • 實現
    sigset_t mask;
    sigemptyset(&mask);
    sigaddset(&mask, SIGINT);
    sigprocmask(SIG_BLOCK, &mask, NULL);  // 阻塞SIGINT
    
  • 特點
    • 被阻塞的信號處于**掛起(Pending)**狀態
    • sigpending() 可獲取掛起信號集
    • 解除阻塞后立即遞送
(2) 信號屏蔽(Masking)
  • 執行處理函數時自動生效
    • 當前處理的信號自動被屏蔽(除非設置 SA_NODEFER
    • 通過 sa_mask 指定額外屏蔽的信號集
  • 作用:防止信號處理函數被重入

4. 信號處理模型

(1) 單次處理模型
struct sigaction sa = {.sa_handler = handler,.sa_flags = SA_RESETHAND  // 處理一次后恢復默認行為
};
  • 特點:類似傳統 signal() 的行為
  • 風險:信號再次發生時可能觸發默認行為(如終止進程)
(2) 持久處理模型
struct sigaction sa = {.sa_handler = handler,.sa_flags = 0  // 持續有效
};
  • 特點:處理函數保持激活狀態
  • 最佳實踐:配合信號阻塞使用
(3) 實時信號處理模型
struct sigaction sa = {.sa_sigaction = rt_handler,.sa_flags = SA_SIGINFO | SA_RESTART
};
  • 特點
    • 支持信號排隊(避免丟失)
    • 可攜帶附加信息(發送者PID、錯誤地址等)
    • 使用 sigqueue() 發送:
    union sigval value = {.sival_int = 42};
    sigqueue(pid, SIGRTMIN+1, value);
    

5. 關鍵系統調用

系統調用用途
sigaction()注冊信號處理行為(核心接口)
sigprocmask()控制進程信號屏蔽集
sigsuspend()原子操作:設置屏蔽集 + 等待信號
kill()/raise()發送信號(跨進程/自身)
sigaltstack()設置備選信號棧(處理棧溢出信號)

6. 特殊處理場景

(1) 系統調用中斷處理
  • 問題:慢速系統調用(如 read())被信號中斷
  • 解決方案
    struct sigaction sa = {.sa_handler = handler,.sa_flags = SA_RESTART  // 自動重啟被中斷的系統調用
    };
    
(2) 信號競爭處理
  • 臨界區保護模式
    sigset_t new_mask, old_mask;
    sigemptyset(&new_mask);
    sigaddset(&new_mask, SIGINT);// 進入臨界區前阻塞信號
    sigprocmask(SIG_BLOCK, &new_mask, &old_mask);/* 臨界區代碼(不會被SIGINT中斷) */// 等待可能發生的信號
    sigsuspend(&old_mask);// 恢復原始屏蔽集
    sigprocmask(SIG_SETMASK, &old_mask, NULL);
    
(3) 子進程終止處理
void sigchld_handler(int sig) {while (waitpid(-1, NULL, WNOHANG) > 0); // 非阻塞回收所有僵尸進程
}// 注冊處理
struct sigaction sa = {.sa_handler = sigchld_handler,.sa_flags = SA_RESTART | SA_NOCLDSTOP
};
sigaction(SIGCHLD, &sa, NULL);

7. 安全編程模型

  1. 異步信號安全(Async-signal-safe):

    • 信號處理函數中只能調用異步安全函數(如 write(), _exit()
    • 禁止調用非可重入函數(malloc, printf 等)
  2. 自包含狀態

    volatile sig_atomic_t flag = 0;  // 信號安全標志void handler(int sig) {flag = 1;  // 僅設置標志,主循環中處理
    }
    
  3. 備選信號棧

    stack_t ss = {.ss_sp = malloc(SIGSTKSZ), .ss_size = SIGSTKSZ
    };
    sigaltstack(&ss, NULL);  // 設置備選棧struct sigaction sa = {.sa_handler = handler,.sa_flags = SA_ONSTACK  // 使用備選棧
    };
    

概念關系圖

+---------------------+
|   信號產生源         | (硬件/內核/進程)
+----------+----------+| 生成信號v
+---------------------+
|   內核信號隊列       | (實時信號排隊)
+----------+----------+| 遞送決策v
+---------------------+  阻塞?   +----------+
|   進程信號屏蔽集     +--------->| 掛起狀態 |
+----------+----------+          +----------+| 未阻塞?v
+---------------------+
|   信號處理分發       |
|  +----------------+ |
|  | 默認行為處理    | |
|  | 忽略信號       | |
|  | 自定義處理函數  | |
|  +----------------+ |
+---------------------+|v
+---------------------+
|   處理函數執行環境   |
|  - 自動信號屏蔽     |
|  - 備選信號棧       |
|  - 中斷系統調用     |
+---------------------+

這些核心概念共同構成了 Unix/Linux 信號處理的完整模型,開發者需要理解其交互機制才能編寫出健壯可靠的信號處理代碼。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/92313.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/92313.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/92313.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

webrtc弱網-OveruseFrameDetector源碼分析與算法原理

一、核心功能CPU負載檢測:監控視頻幀的捕獲、編碼、發送全流程耗時,實時計算CPU使用率自適應決策:基于CPU使用率閾值觸發視頻質量調整(降級/升級)多策略支持:提供新舊兩套CPU負載估計算法,支持實…

Spring Cloud系列—Eureka服務注冊/發現

上篇文章: Spring Cloud系列—簡介https://blog.csdn.net/sniper_fandc/article/details/149936339?fromshareblogdetail&sharetypeblogdetail&sharerId149936339&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 在上篇文章中&…

QUdpSocket 詳解:從協議基礎、通信模式、數據傳輸特點、應用場景、調用方式到實戰應用全面解析

前言 在網絡通信的世界里,UDP 協議以其獨特的 “快準狠” 特性占據著一席之地。作為 Qt 框架中 UDP 協議的封裝者,QUdpSocket 為開發者提供了便捷高效的網絡編程接口。? 一、UDP 協議基礎:QUdpSocket 的 歷史 要理解 QUdpSocket,…

vue中reactive()和ref()的用法

在 Vue 3 的 Composition API 里,reactive() 和 ref() 都是用來把「普通數據」變成「響應式數據」的函數。 一句話區別: reactive() 只能包裹對象/數組;ref() 可以包裹任何類型,但在 模板 里讀取時,不需要 .value。 下…

【公考基礎】----備考規劃篇

公考 公考:國家公務員考試 即:國考和省考 或 參公考試 包括但不限于:國考、省考、事業單位招考、教師招聘考試、軍隊文職招考等,一切進入國家黨政軍事業單位的考試。 考公整體流程 備考前:準備備考資料&#xf…

STM32江科大學習筆記,全功能按鍵非阻塞式實現,按鍵點擊,雙擊,長按

目錄 一、前言 二、關于實現非阻塞的辦法 2.1 中斷類型的選擇 2.2 定時器中斷 二、程序流程圖 2.1 狀態S0空閑狀態 2.2 狀態S1按鍵判斷長按還是其他的事件 2.3 狀態S2按鍵判斷雙擊或者單擊 2.4 狀態S3按鍵已雙擊狀態 2.5 狀態S4長按狀態 三、編寫代碼 3.1 按鍵初始…

動態代理常用的兩種方式?

口語化回答好的,面試官,動態常見的兩種,一種是 jdk 動態代理,一種是 cglib 動態代理,兩者的最主要區別是 jdk 動態代理主要是依賴于接口創建代理對象,cglib 是通過生成子類的方式,不需要接口&am…

StarRocks vs ClickHouse:2025 年 OLAP 引擎終極對比指南

StarRocks 與 ClickHouse:高性能 OLAP 引擎的兩種選擇在當今數據驅動的商業環境中,選擇合適的分析型數據庫對于企業數據戰略至關重要。StarRocks 和 ClickHouse 作為兩款領先的 OLAP(在線分析處理)引擎,各自擁有獨特的…

RuoYi-Cloud 微服務本地部署詳細流程實錄(IDEA + 本地 Windows 環境)

本文以 RuoYi-Cloud 3.x 版本為例,開發工具用的是 IntelliJ IDEA,數據庫為 MySQL 8.x,注冊中心選用本地 Nacos 2.2.3,Redis 為 3.x/5.x 均可。親測全流程可用,細節與官方文檔略有不同,避免新手踩坑。 目錄 …

2025年了,程序員轉行還這么難?別愁!大模型這趟“順風車”,你搭不搭?

在“大齡程序員的未來在何方”這篇文章里比較樂觀地介紹了程序員保持競爭力的幾個方向,但現實依然是殘酷的:很多人將不得不離開軟件開發工作,轉型去從事其他職業。 當你要這么做時,就會感慨:想不到一切竟如此艱難&…

CEH、OSCP、CISP、CISSP 四大網絡安全認證攻略

以下是 CEH、OSCP、CISP、CISSP 四大網絡安全認證的詳細對比,涵蓋認證定位、考試難度、適用場景及職業方向,幫助你快速選擇適合自己的證書:1. 核心區別速覽認證發證機構定位 考試形式適合人群國際認可度CEHEC-Council道德黑客滲透測試基礎選擇…

SnapDevelop支持uni-app開發:跨平臺與原生體驗的完美融合

隨著移動互聯網的迅速發展,開發者面臨著多平臺需求和技術挑戰。傳統開發模式要求為每個平臺編寫獨立代碼,不僅浪費時間,還增加了維護難度。作為一款強大的低代碼開發工具,SnapDevelop打破了這一局限,通過對uni-app的支…

海康威視相機,MVS連接成功,但無圖像怎么辦?

問題:準備一個常見的海康 相機去海康機器視覺官網下載MVS軟件。打開軟件,連接相機。顯示連接成功,并能看到相機的信息。點擊開始采集發現沒有圖像解決:右側找到觸發。1. 觸發模式 ON2.選擇 軟觸發3 啟用自動觸發點擊采集有圖像但一…

Linux systemd 系統管理:systemctl 控制服務與守護進程

Linux systemd 系統管理:systemctl 控制服務與守護進程系統啟動過程 Linux 系統的啟動過程遵循以下步驟: 開機自檢:計算機啟動后,BIOS/UEFI 進行硬件自檢,確認硬件設備正常MBR 引導:從指定的啟動設備讀取主…

《Day2-PyTorch Tensor 從入門到實踐:核心操作與避坑指南》

一、Tensor的創建 在Torch中張量以 "類" 的形式封裝起來,對張量的一些運算、處理的方法被封裝在類中,官方文檔: torch — PyTorch 2.7 documentation 1. 基本創建方式 以下講的創建tensor的函數中有兩個有默認值的參數dtype和d…

兩種格式數據介紹——bin 、 yuv文件

一、場景存儲 通常指的是用于存儲攝像頭或傳感器原始采集數據的文件格式,尤其是在自動駕駛、機器人、安防、工業視覺等需要記錄真實世界場景的應用中。格式存儲內容用途場景特點.binLiDAR點云、毫米波雷達數據、IMU、GPS、原始傳感器幀自動駕駛仿真、SLAM建圖、數據…

【網絡運維】Linux:SELinux簡介和配置

SELinux 介紹 SELinux 概述 文件權限控制了哪些用戶或用戶組可以訪問哪些特定文件,但未限定用戶訪問文件的方式。 例如:對于文件的寫入權限而言, 結構化數據文件是否應當設計為只能使用特定的程序寫入,但其他編輯器仍可以打開和修…

GaussDB SQL執行計劃詳解

1 問題現象SQL執行計劃是GaussDB性能分析及調優的核心,它輸出三個關鍵信息:訪問路徑:掃描表數據的路徑。連接順序:多表連接順序。連接方式:多表連接方式。2 技術背景GaussDB SQL語句執行計劃是數據庫為運行SQL語句而執行的操作步驟…

02.【數據結構-C語言】順序表(線性表概念、順序表實現:增刪查、前向聲明、順序表實現通訊錄項目:增刪改查、通訊錄數據導入及保存到本地文件)

目錄 1. 線性表 2. 順序表概念及分類 2.1 順序表的概念 2.2 順序表分類 2.3 動靜態順序表對比 3. 順序表的實現(附完整版代碼) 3.1 順序表結構體聲明 3.2 初始化&銷毀 3.3 插入(尾插、頭插、指定位置之前插入) 3.4 …

MyBatis核心配置深度解析:從XML到映射的完整技術指南

🔧 MyBatis核心配置深度解析:從XML到映射的完整技術指南 🚀 引言:MyBatis作為Java生態中最受歡迎的持久層框架之一,其強大的配置體系是實現靈活數據訪問的核心。本文將深入解析MyBatis的配置文件架構、映射機制以及高級…