Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux 信號機制深度解析:未決、阻塞與生命週期

編輯:Linux 教學

核心概念辨析

理解 Linux 信號機制,關鍵在於區分兩個易混淆的概念:

  • 未決: 一種狀態。指信號產生後,尚未被處理前的時段。信號滯留於進程的「未決信號集」中。
  • 阻塞: 一種開關動作(而非狀態)。指設置信號屏蔽字,暫時禁止信號遞達處理,但不阻止信號產生。被阻塞的信號會進入「未決」狀態。

經典場景演示

參考 APUE 範例:進程調用 sigprocmask 阻塞 SIGQUIT → sleep(5) 期間按下 Ctrl+\ 產生信號 → 信號因阻塞變為「未決」 → sleep 返回 → 再次 sigprocmask 解除阻塞 → sigprocmask 返回前,未決信號立即被處理(執行處理函數)。

關鍵結論: 信號被阻塞並未丟棄,解除阻塞瞬間自動處理所有未決同類信號(標準信號僅處理一次,實時信號排隊處理)。

核心 API

#include <signal.h>

// 獲取未決信號集
int sigpending(sigset_t *set);

// 信號屏蔽字操作
int sigprocmask(int how, const sigset_t *set, sigset_t *oset);
// how: SIG_BLOCK(阻塞) | SIG_UNBLOCK(解除) | SIG_SETMASK(設定)

信號生命週期四階段

  1. 誕生: 硬體異常、定時器、kill()/sigqueue() 觸發。
  2. 注冊: 信號值加入進程 task_struct->pending.signal 集合,攜帶資訊存入 sigqueue 鏈表。
    • 標準信號:同一信號僅注冊一次,重複產生會丟棄(不可靠)。
    • 實時信號:每次產生皆注冊,支援排隊(可靠)。
  3. 注銷: 進程從內核態返回用戶態前檢測未決信號,若無阻塞則移出 sigqueue、準備調用處理函數。標準信號同步清除集合位,實時信號視鏈表剩餘節點決定。
  4. 終止: 執行處理函數完畢,本次信號生命週期結束。

關鍵數據結構

struct sigpending {
    struct sigqueue *head, **tail; // 未決信號資訊鏈
    sigset_t signal;               // 未決信號集
};

struct sigqueue {
    struct sigqueue *next;
    siginfo_t info;                // 信號攜帶資訊
};

總結

「阻塞」是開關,「未決」是狀態。掌握 sigprocmask/sigpending 配合信號集操作,能精準控制信號遞達時機,是編寫健壯並發程式的基石。

Copyright © Windows教程網 All Rights Reserved