Linux信號處理解析:從入門到實戰


Linux信號處理全解析:從入門到實戰

一、初識Linux信號:系統級的"緊急電話"

  1. 信號是什么?
    信號是Linux系統中進程間通信的"緊急通知",如同現實中的交通信號燈。當用戶按下Ctrl+C(產生SIGINT信號)時,相當于給程序發送了"立即停車"的指令。

  2. 常見信號速查表(精簡版)
    | 信號編號 | 名稱 | 觸發方式 | 默認行為 |
    |----------|-----------|------------------------|------------------------|
    | 1 | SIGHUP | 終端斷開 | 終止進程 |
    | 2 | SIGINT | Ctrl+C | 終止進程 |
    | 9 | SIGKILL | kill -9 | 強制終止 |
    | 15 | SIGTERM | 默認終止信號 | 優雅終止 |
    | 17 | SIGCHLD | 子進程狀態改變 | 通知父進程 |

生活案例:SIGTERM(15)如同禮貌的停車請求,SIGKILL(9)則是拖車強制拖走。


二、信號操作入門:從命令行到代碼

  1. 終端操作雙雄:kill vs killall
優雅終止nginx進程(發送SIGTERM)
$ kill 1234 強制終止所有python進程 
$ killall -9 python 查看信號列表 
$ kill -l 

對比項:

  • kill:精確打擊(需知道PID)
  • killall:范圍清除(按進程名稱)
  1. 編程基礎:發送信號的兩種姿勢
// 發送信號給其他進程 
kill(pid, SIGTERM);// 給自己發送信號 
raise(SIGINT);

實驗場景:創建父子進程,通過SIGCHLD實現僵尸進程回收(代碼示例見附錄A)


三、信號處理進階:從接收到響應

  1. 信號處理三劍客
// 簡單注冊(傳統方式)
signal(SIGINT, handler);// 高級注冊(推薦方式)
struct sigaction sa;
sa.sa_handler = handler;
sigaction(SIGINT, &sa, NULL);

對比實驗:

  • 連續快速按Ctrl+C時,signal可能丟失信號,而sigaction能正確捕獲
  1. 定時器實戰:鬧鐘與秒表
alarm(5);  // 5秒后觸發SIGALRM 
ualarm(500000, 1000000); // 0.5秒后首次觸發,之后每1秒觸發 // 高精度定時器 
struct itimerval timer = {{2, 500000},  // 每2.5秒重復 {1, 0}        // 首次1秒后觸發 
};
setitimer(ITIMER_REAL, &timer, NULL);

應用場景:實現精準心跳檢測(誤差<1ms)


四、信號控制藝術:精確管理的秘訣

  1. 信號集操作四部曲
sigset_t set;
sigemptyset(&set);          // 初始化空集合 
sigaddset(&set, SIGINT);    // 添加SIGINT 
sigprocmask(SIG_BLOCK, &set, NULL); // 阻塞信號 
sigpending(&set);           // 查看待處理信號 
  1. 信號屏蔽的三種策略
    | 策略 | 效果 | 適用場景 |
    |--------------|--------------------------------|------------------------|
    | 完全阻塞 | 信號永不遞送 | 關鍵代碼段保護 |
    | 臨時阻塞 | 延遲信號處理 | 事務操作 |
    | 選擇性接收 | 通過sigsuspend控制 | 高并發事件處理 |

五、sigsuspend的原子魔法:解決世紀難題

  1. 傳統方案的致命缺陷
sigprocmask(SIG_UNBLOCK, &set, NULL); // 解除阻塞 
pause(); // 這里可能永遠阻塞!
  1. sigsuspend的原子化操作
sigset_t mask;
sigfillset(&mask);
sigsuspend(&mask); // 原子化:解除阻塞+等待信號 

原理圖解:

[初始狀態] -> [保存掩碼] -> [設置新掩碼] -> [等待信號]↑                                  |+--------[恢復原始掩碼]←-----------+
  1. 實戰案例:安全信號等待器
void handler(int sig) {printf("Received %d\n", sig);
}int main() {struct sigaction sa;sigset_t mask;sigemptyset(&mask);sigaddset(&mask, SIGINT);sigprocmask(SIG_BLOCK, &mask, NULL);sa.sa_handler = handler;sigaction(SIGINT, &sa, NULL);while(1) {printf("Waiting...\n");sigsuspend(&mask); // 安全等待信號 }
}

六、性能優化與避坑指南

  1. 信號處理黃金法則

  2. 精簡處理函數:避免調用非異步安全函數

  3. 使用volatile變量:保證標志位的可見性

  4. 優先選擇sigaction:確保可靠性和可移植性

  5. 注意信號隊列:實時信號(SIGRTMIN+)支持排隊

  6. 多線程慎用:每個線程有獨立信號掩碼

  7. 常見問題解決方案
    | 問題現象 | 解決方案 |
    |------------------------|------------------------------|
    | 僵尸進程堆積 | SIGCHLD+wait組合拳 |
    | 服務無法正常關閉 | 捕獲SIGTERM實現優雅退出 |
    | 定時任務執行滯后 | 使用setitimer提高精度 |
    | 信號處理函數被重復調用 | 設置SA_NODEFER標志 |


附錄A:僵尸進程回收代碼示例

// SIGCHLD處理示例 
void sigchld_handler(int sig) {while(waitpid(-1, NULL, WNOHANG) > 0);
}int main() {struct sigaction sa;sa.sa_handler = sigchld_handler;sigaction(SIGCHLD, &sa, NULL);if(fork() == 0) {// 子進程邏輯 exit(0);}while(1) pause();
}

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

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

相關文章

Java的Selenium的特殊元素操作與定位之select下拉框

如果頁面元素是一個下拉框&#xff0c;我們可以將此web元素封裝為Select對象 Select selectnew Select(WebElement element); Select對象常用api select.getOptions();//獲取所有選項select.selectBylndex(index);//根據索引選中對應的元素select.selectByValue(value);//選…

藍橋云客 刷題統計

刷題統計 問題描述 小明決定從下周一開始努力刷題準備藍橋杯競賽。他計劃周一至周五每天做 a 道題目&#xff0c;周六和周日每天做 b 道題目。請你幫小明計算&#xff0c;按照計劃他將在第幾天實現做題數大于等于 n 題&#xff1f; 輸入格式 輸入一行包含三個整數 a, b 和 …

三防筆記本有什么用 | 三防筆記本有什么特別

在現代社會&#xff0c;隨著科技的不斷進步&#xff0c;筆記本電腦已經成為人們工作和生活的重要工具。然而&#xff0c;在一些特殊的工作環境和極端條件下&#xff0c;普通筆記本電腦往往難以滿足需求。這時&#xff0c;三防筆記本以其獨特的設計和卓越的性能&#xff0c;成為…

智能體和RPA都需要程序思維,如何使用影刀的變量?

歡迎來到濤濤聊AI&#xff0c; 不管AI還是RPA&#xff0c;都需要用到編程思想才能完成批量工作。今天研究了下影刀的變量。 變量類型 根據變量值選擇相應的類型&#xff0c;可選擇任意一種影刀所支持的數據類型 變量值 指定變量中保存的值&#xff0c;會根據不同的類型設置…

【藍橋杯】算法筆記3

1. 最長上升子序列(LIS) 1.1. 題目 想象你有一排數字,比如:3, 1, 2, 1, 8, 5, 6 你要從中挑出一些數字,這些數字要滿足兩個條件: 你挑的數字的順序要和原來序列中的順序一致(不能打亂順序) 你挑的數字要一個比一個大(嚴格遞增) 問:最多能挑出多少個這樣的數字? …

性能測試之jmeter的基本使用

簡介 Jmeter是Apache的開源項目&#xff0c;基于Java開發&#xff0c;主要用于進行壓力測試。 優點&#xff1a;開源免費、支持多協議、輕量級、功能強大 官網&#xff1a;https://jmeter.apache.org/index.html 安裝 安裝步驟&#xff1a; 下載&#xff1a;進入jmeter的…

【NLP 面經 7、常見transformer面試題】

目錄 1. 為何使用多頭注意力機制&#xff1f; 2. Q和K使用不同權重矩陣的原因 3. 選擇點乘而非加法的原因 4. Attention進行scaled的原因 5. 對padding做mask操作 6. 多頭注意力降維原因 7. Transformer Encoder模塊簡介 8. 乘以embedding size的開方的意義 9. 位置編碼 10. 其…

【深度學習】CNN簡述

文章目錄 一、卷積神經網絡&#xff08;CNN&#xff09;二、CNN結構特性1. CNN 典型結構2. 局部連接3. 權重共享4.空間或時間上的次采樣 三、理解層面 一、卷積神經網絡&#xff08;CNN&#xff09; 卷積神經網絡(Convolutional Neural Network&#xff0c;CNN)是一種用于處理…

理解OSPF 特殊區域NSSA和各類LSA特點

本文基于上文 理解OSPF Stub區域和各類LSA特點 在理解了Stub區域之后&#xff0c;我們再來理解一下NSSA區域&#xff0c;NSSA區域用于需要引入少量外部路由&#xff0c;同時又需要保持Stub區域特性的情況 一、 網絡總拓撲圖 我們在R1上配置黑洞路由&#xff0c;來模擬NSSA區域…

論文閱讀筆記:Denoising Diffusion Implicit Models (5)

0、快速訪問 論文閱讀筆記&#xff1a;Denoising Diffusion Implicit Models &#xff08;1&#xff09; 論文閱讀筆記&#xff1a;Denoising Diffusion Implicit Models &#xff08;2&#xff09; 論文閱讀筆記&#xff1a;Denoising Diffusion Implicit Models &#xff08…

藍橋杯2024年第十五屆省賽真題-R 格式

題目鏈接&#xff1a; 思路&#xff1a; 通過數組模擬d的每一位&#xff0c;逐位進行計算&#xff0c;從而實現對d的精確處理。 代碼&#xff1a; #include<bits/stdc.h> #define int long long using namespace std; const int N 2020;int n; string s; vector<i…

深入探索 Linux Top 命令:15 個實用示例

在 Linux 系統管理中&#xff0c;top 命令是系統性能監控不可或缺的工具。它能夠實時顯示系統的 CPU、內存、進程等資源的使用情況&#xff0c;幫助您快速識別性能瓶頸和異常進程。本文將詳細介紹 15 個實用的 top 命令使用示例&#xff0c;旨在幫助您更高效地進行系統管理與優…

15.1linux設備樹下的platform驅動編寫(知識)_csdn

上一章我們詳細的講解了 Linux 下的驅動分離與分層&#xff0c;以及總線、設備和驅動這樣的驅動框架。基于總線、設備和驅動這樣的驅動框架&#xff0c; Linux 內核提出來 platform 這個虛擬總線&#xff0c;相應的也有 platform 設備和 platform 驅動。 上一章我們講解了傳統的…

Eclipse 視圖(View)

Eclipse 視圖(View) Eclipse 視圖(View)是 Eclipse 界面的重要組成部分,它提供了用戶交互的平臺,使得用戶可以通過圖形界面來編輯、調試、分析代碼等。在本文中,我們將深入探討 Eclipse 視圖的功能、使用方法以及它們在軟件開發中的作用。 1. 視圖的功能 Eclipse 視圖具…

Python解決“數字插入”問題

Python解決“數字插入”問題 問題描述測試樣例解題思路代碼 問題描述 小U手中有兩個數字 a 和 b。第一個數字是一個任意的正整數&#xff0c;而第二個數字是一個非負整數。她的任務是將第二個數字 b 插入到第一個數字 a 的某個位置&#xff0c;以形成一個最大的可能數字。 你…

ubuntu部署ollama+deepseek+open-webui

ubuntu部署ollamadeepseekopen-webui 全文-ubuntu部署ollamadeepseekopen-webui 大綱 Ollama部署 安裝Ollama&#xff1a;使用命令apt install curl和curl -fsSL https://ollama.com/install.sh | sh ollama-v網絡訪問配置&#xff1a;設置環境變量OLLAMA_HOST0.0.0.0:11434&…

Java的Selenium常用的元素操作API

click 觸發當前元素的點擊事件 clear() 清空內容 sendKeys(...) 往文本框一類元素中寫入內容 getTagName() 獲取元素的的標簽名 getAttribute(屬性名) 根據屬性名獲取元素屬性值 getText() 獲取當前元素的文本值 isDisplayed() 查看元素是否顯示 get(String url) 訪…

洛谷題單3-P1035 [NOIP 2002 普及組] 級數求和-python-流程圖重構

題目描述 已知&#xff1a; S n 1 1 2 1 3 … 1 n S_n 1\dfrac{1}{2}\dfrac{1}{3}…\dfrac{1}{n} Sn?121?31?…n1?。顯然對于任意一個整數 k k k&#xff0c;當 n n n 足夠大的時候&#xff0c; S n > k S_n>k Sn?>k。 現給出一個整數 k k k&#xff0…

CMDB平臺(進階篇):3D機房大屏全景解析

在數字化轉型的浪潮中&#xff0c;數據中心作為企業信息架構的核心&#xff0c;其高效、智能的管理成為企業競爭力的關鍵因素之一&#xff0c;其運維管理方式也正經歷著革命性的變革。傳統基于二維平面圖表的機房監控方式已難以滿足現代企業對運維可視化、智能化的需求。樂維CM…

小白速通:Verilog流水線實現及時序分析

目錄 題目&#xff1a;時序分析&#xff1a;時鐘頻率為50MHz數據1: a10, b20, c30, d40, e2數據2: a5, b15, c25, d35, e3數據3: a8, b12, c16, d24, e4 流水線效率分析 題目&#xff1a; verilog中&#xff0c;y(abcd)*e&#xff0c;時鐘頻率為50Mhz&#xff0c;用流水線的形式…