淺析Linux進程信號處理機制:基本原理及應用

文章目錄

    • 概述
    • 信號類型
      • 可靠信號與不可靠信號
      • Fatal信號與Non Fatal信號
      • 不可捕獲/忽略信號
    • 信號工作機制
      • 信號處理方式
      • 信號嵌套處理
    • 信號使用
      • 信號發送
        • kill命令
      • 注冊信號處理函數
    • 信號安全與函數可重入性
      • 可重入函數
      • 線程安全與可重入性
    • 相關參考

概述

Linux信號機制是進程間通信的一種方式,用于在不同進程之間傳遞信息,它通過向目標進程發送一個特定的信號,來觸發目標進程執行相應的處理操作。信號本質上是在軟件層次上對中斷機制的一種模擬,可以認為是用戶態下的中斷機制,它為用戶進程提供了一種處理異步事件的方法;用戶進程可以注冊自定義的信號處理函數,在進程響應外部信號時,會自動調用回調進行處理。

信號類型

Linux定義了64種信號類型,每個信號都有唯一的編號進行標識。在系統中,通過kill -l命令可以查看所有的信號類型。

可靠信號與不可靠信號

Linux信號可以分為不可靠信號和可靠信號。

  • 不可靠信號:又稱非實時信號,是指在信號傳遞過程中可能丟失或產生不可預測行為的信號,這意味著當一個進程接收到該信號時,無法確保該信號一定會被進程處理。1-31號信號為不可靠信號
  • 可靠信號:又稱實時信號,是保證傳遞和處理的信號。當一個進程接收到可靠信號時,系統會確保該信號不會丟失,并且會等待進程處理完該信號后再繼續執行其他操作,Linux使用隊列來保存待處理的信號,保證它們按照接收的順序被進程處理。34-64號信號為可靠信號

在日常開發及維護時,見到的基本是不可靠信號:
在這里插入圖片描述

Fatal信號與Non Fatal信號

對于每一個信號,系統都有默認的處理行為,根據信號的默認處理行為,可以將信號分為 Fatal(致命)信號和 Non-Fatal(非致命)信號。

  • Fatal信號:Fatal 信號是指那些默認處理行為會導致進程終止的信號。當進程收到這類信號且沒有注冊自定義處理函數時,進程會被終止。
  • Non Fatal信號:Non-Fatal 信號是指那些默認處理行為不會導致進程終止的信號。這些信號通常用于控制進程狀態或通知特定事件。

不可捕獲/忽略信號

在Linux系統中,用戶通常可以捕獲信號,并自定義處理信號處理行為;但有兩個信號比較特殊,它們既不能忽略,也不能捕獲,只能執行默認處理:

  • SIGKILL (9):強制終止進程
  • SIGSTOP (19):暫停進程

信號工作機制

與中斷的實時響應(CPU執行完一條指令后,就會響應中斷請求)不同,進程對信號的處理有一定的滯后性。原因在于,當應用進程接收到其它進程發送的信號時,不會立即做出響應,只有等當前進程陷入到內核空間時,才會進行信號檢測。Linux系統中,應用程序處理信號的流程示意如下:
在這里插入圖片描述

可以看到,系統對信號的檢測與響應總是發生在內核態,只有當前進程由于系統調用、中斷或異常而進入系統空間以后,從系統空間返回到用戶空間的前夕,內核才會進行信號的處理。

檢測到信號后,內核在用戶棧創建新層,將返回地址指向信號處理函數,確保函數在用戶態執行,避免權限泄露;信號處理程序執行完成后,會執行sigreturn系統調用再次切換到內核態,再由恢復原系統調用或代碼執行點。

信號處理方式

在進程接收到一個信號時,可以告訴內核按照下列三種方式之一進行處理:

  • 忽略信號:對信號不做任何處理(但 SIGKILL 和 SIGSTOP 不能被忽略);
  • 捕獲信號:注冊自定義的信號處理函數;
  • 默認處理:執行系統定義的默認動作。Linux信號的默認處理行為可以分為以下幾類:
    • Terminate:終止進程;
    • Coredump:終止進程并生成核心轉儲文件;
    • Ignore:忽略信號;
    • Stop:暫停進程;
    • Continue:繼續運行進程。

信號嵌套處理

默認情況下,信號處理函數運行期間,如果再次接收到相同信號,信號會被自動阻塞,直到當前處理函數執行完畢。

信號使用

在日常開發或維護過程中,所涉及到信號的使用方式,主要是如何發送信號以及自定義程序的信號的處理行為。

信號發送

Linux系統使用kill系統調用向指定進程發送信號,原型定義如下:

 #include <sgnal.h> 
int kill(int pid, int sign);

kill函數的pid參數根據取值有多重含義:

  • pid>0:將此信號發送給進程ID為pid的進程;
  • pid=0:將此信號發送給進程組ID和該進程相同的進程;
  • pid<0:將此信號發送給進程組內進程ID為pid的進程;
  • pid=-1:將此信號發送給系統所有的進程。
kill命令

在Linux系統中,kill命令用于向進程發送信號,以終止或控制進程。默認情況下,kill命令發送的是SIGTERM(終止信號),這通常會讓進程自行清理資源并優雅地終止。如果進程沒有響應SIGTERM,可以使用SIGKILL(殺死信號)強制終止進程。

kill [-signum] [PID]

注冊信號處理函數

Linux系統下可以通過signalsigaction函數可以注冊信號處理函數。signal原型如下:

#include <signal.h>
void (*signal(int signum, void (*handler)(int)))(int);
sigaction是 signal的增強版,提供了更精細的控制,包括:
* 自定義信號處理函數
* 設置信號屏蔽字(阻塞其他信號)
* 指定信號處理標志(如是否自動重置處理函數)

sigaction函數原型定義如下:

#include <signal.h>
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

信號安全與函數可重入性

信號安全是指線程在信號處理函數當中,不管以任何方式調用你的函數如果不死鎖不修改數據,那就是信號安全的。在信號處理函數中應避免調用不可重入的函數(如 printf、malloc),否則可能導致程序崩潰。

可重入函數

一個函數或代碼段若能在被中斷后安全地再次調用(如信號處理函數中調用),則稱為可重入的。不可重入的代碼會導致數據損壞或死鎖。
可重入代碼的條件:

  1. 不使用全局或靜態變量:依賴局部變量或通過參數傳遞狀態。
  2. 不調用不可重入函數:如malloc()、printf()、非線程安全的庫函數。
  3. 避免鎖的嵌套:信號處理函數中不應獲取鎖(可能引發死鎖)。
    在這里插入圖片描述

線程安全與可重入性

可重入函數是線程安全函數的一個真子集。可重入函數一定是線程安全的。盡管線程安全和可重入有時會被不正確地用作同義詞,但它們之間有清晰的技術差別。線程安全函數可能使用同步機制(如鎖)來保護共享數據,而可重入函數則完全不使用共享數據。

相關參考

  • 《Unix環境高級編程》
  • Linux signal 圖文詳解(一)信號簡介、信號注冊
  • 干貨】linux內核信號的處理過程

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

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

相關文章

【學習K230-例程19】GT6700-TCP-Client

B站視頻 TCP TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff0c;傳輸控制協議/網際協議&#xff09;是指能夠在多個不同網絡間實現信息傳輸的協議簇。TCP/IP 協議不僅僅指的是 TCP和 IP 兩個協議&#xff0c;而是指一個由 FTP、SMTP、TCP、UDP、I…

o2oa待辦流程和已辦流程表

在o2oa系統中每個用戶有兩種唯一標識&#xff1a;第一種是姓名個人釘釘ID&#xff08;或者o2oa創建該用戶時設置的id&#xff09;ORG_PERSON.xdistinguishedName劉準3013692136672430P第二種是姓名所在部門的釘釘id個人釘釘idORG_IDENTITY.xdistinguishedName劉準966488616_301…

QT零基礎入門教程

基礎篇第一章 QT 基礎認知1.1 什么是 QT&#xff08;What&#xff09;?定義&#xff1a;跨平臺 C 應用開發框架&#xff0c;不僅用于 UI 設計&#xff0c;還包含核心功能&#xff08;如事件、網絡、數據庫&#xff09;。?核心特性&#xff1a;?跨平臺&#xff1a;一套代碼支…

遠程依賴管理新范式:cpolar賦能Nexus全球協作

文章目錄 前言一. Docker安裝Nexus二. 本地訪問Nexus三. Linux安裝Cpolar四. 配置Nexus界面公網地址五. 遠程訪問 Nexus界面六. 固定Nexus公網地址七. 固定地址訪問Nexus 前言 Nexus作為一款企業級倉庫管理工具&#xff0c;其核心功能在于集中管理各類軟件依賴&#xff0c;提供…

Prompt技術深度解析:從基礎原理到前沿應用的全面指南

引言 在人工智能技術飛速發展的今天&#xff0c;Prompt技術&#xff08;提示詞工程&#xff09;已成為連接人類智慧與機器智能的重要橋梁。隨著GPT-4、Claude、Gemini等大型語言模型的廣泛應用&#xff0c;如何有效地與這些AI系統進行交互&#xff0c;已成為決定AI應用成功與否…

性能測試工具Jmeter之java.net.BindException: Address already in use

首先請參考連接&#xff1a;https://blog.csdn.net/weixin_46190208/article/details/115229733 。配置完注冊表后一般就能解決問題。但并未解決我的問題 注冊表的MaxUserPort&#xff0c;TcpTimedWaitDelay兩個參數我只能配置MaxUserPort&#xff0c;設置TcpTimedWaitDelay后&…

JDK 新特性

JDK 新特性引入模塊Java 9 開始引入了模塊&#xff08;Module&#xff09;&#xff0c;目的是為了管理依賴。使用模塊可以按需打包 JRE 和進一步限制類的訪問權限。接口支持私有方法JAVA 9 開始&#xff0c;接口里可以添加私有方法&#xff0c;JAVA 8 對接口增加了默認方法的支…

如何高效應對網站反爬蟲策略?

現在大型網站的反爬策略越來越高明了&#xff0c;不僅是對IP訪問頻率、User-Agent請求頭進行異常識別&#xff0c;還會分析IP地址、瀏覽器指紋、JS動態加載、API逆向、行為模式等方式各種設卡&#xff0c;動不動跳出五花八門的驗證碼&#xff0c;非常難搞。 怎么應對反爬是個系…

c++ shared_ptr理解

不是一個智能指針對于一個計數器嗎&#xff1f;怎么變成共有資源的計數器了&#xff1f;你的意思是多個對象共用一個計數器&#xff1f;你問到了 std::shared_ptr 最核心、最精妙的設計機制&#xff01;你的問題非常深刻&#xff1a;“不是一個智能指針對應一個計數器嗎&#x…

002 Rust環境搭建

Rust環境搭建 現在很多集成開發環境(IDE)基本上都支持Rust開發。官方公布的支持工具&#xff1a;https://www.rust-lang.org/zh-CN/tools 這里以Windows 10 64位系統 Visual Studio Code為例來搭建Rust開發環境。 Rust安裝 Rust 的編譯工具依賴 C 語言的編譯工具&#xff0…

【Unity進階】Unity發布PC端,隱藏并自定義默認標題欄

開發環境&#xff1a; Unity2019.3.16f1c1 - 個人版 Visual Studio Community 2019 Windows10 專業版 x64嘿&#xff0c;各位朋友們&#xff01;當咱們歡歡喜喜地把項目打包成PC平臺的exe窗口程序&#xff0c;準備在電腦上一展游戲風采時&#xff0c;卻發現冒出來個Windows風格…

國產延時芯片EH3B05上電延時3秒開關機芯片方案超低功耗

EH3B05-4941-24A1延時開關芯片是一款專為低功耗電子產品設計的高效時序控制器件&#xff0c;其核心功能在于提供精確的多通道延時信號輸出。該芯片采用SOT23-6超小封裝&#xff0c;體積僅為2.9mm2.8mm1.3mm&#xff0c;特別適合空間受限的便攜式設備。其工作電壓范圍覆蓋2.0V至…

大數據與財務管理專業如何轉型做金融科技?

在數字經濟加速演進的今天&#xff0c;金融行業的邊界正在被數據與技術重新定義。傳統金融崗位正經歷深刻變革&#xff0c;而"金融科技"&#xff08;FinTech&#xff09;作為技術與金融深度融合的產物&#xff0c;已成為行業轉型升級的核心引擎。越來越多具備數據背景…

Windows、Linux 系統 nodejs 和 npm 版本更新及錯誤修復

一、推薦使用 nvm 工具&#xff0c;直接通過命令行安轉和切換各個版本 無論是 Windows 平臺&#xff0c;還是 Linux 平臺&#xff0c;都推薦使用 nvm 工具。 nvm&#xff08;Node.js Version Management&#xff09;&#xff0c;是一個 nodejs 的版本管理工具。它是專門為解決…

【系列文章】Linux中的并發與競爭[03]-自旋鎖

【系列文章】Linux中的并發與競爭[03]-自旋鎖 該文章為系列文章&#xff1a;Linux中的并發與競爭中的第3篇 該系列的導航頁連接&#xff1a; 【系列文章】Linux中的并發與競爭-導航頁 文章目錄【系列文章】Linux中的并發與競爭[03]-自旋鎖一、自旋鎖二、實驗程序的編寫2.1驅動…

開始 ComfyUI 的 AI 繪圖之旅-Cosmos Predict2世界模型文生圖(全網首發,官網都沒有更新)(十三)

文章標題一、Cosmos-Predict21.Cosmos Predict2 Text2Image 工作流1.1 下載工作流文件1.2 手動模型安裝1.3 按步驟完成工作流運行本文介紹了如何在 ComfyUI 中完成 Cosmos-Predict2 文生圖的工作流 一、Cosmos-Predict2 Cosmos-Predict2 是由 NVIDIA 推出的新一代物理世界基礎模…

深度學習優化器進化史:從SGD到AdamW的原理與選擇

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;注冊即送-H卡級別算力&#xff0c;80G大顯存&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生更享專屬優惠。 引言&#xff1a;優化器——深度學習的引擎 在深度學習…

工商業屋頂分布式光伏監控系統助力園區企業錯峰有序用電

一、行業痛點與需求分析分布式光伏發電作為清潔能源的重要形式&#xff0c;近年來在工商業屋頂、戶用場景中快速普及。然而&#xff0c;其“小而散”的特性導致電網適應性、運維效率、安全管控等方面面臨顯著挑戰&#xff1a;1.電網適應性難題&#xff1a;高滲透率場景下&#…

華為初級認證培訓需要嗎?HCIA考試考什么內容?自學還是報班?

大家好&#xff0c;這里是G-LAB IT實驗室。 在信息技術發展日新月異的今天&#xff0c;華為的ICT認證逐漸成為了行業內重要的技術標桿。而HCIA&#xff08;Huawei Certified ICT Associate&#xff09;作為華為初級認證&#xff0c;對于ICT技術從業者來說&#xff0c;既是職業發…

元宇宙與旅游產業:沉浸式體驗重構旅行全流程

1 元宇宙重構旅游核心場景1.1 目的地體驗&#xff1a;從 “實地觀光” 到 “虛實融合深度探索”傳統旅游目的地體驗受限于時間、空間與物理條件&#xff0c;元宇宙通過 “數字孿生 超現實創作”&#xff0c;打造 “超越實地” 的沉浸式目的地體驗。在文化遺產體驗中&#xff0…