首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Linux C 編程:sigsuspend 原子操作流程深度解析

     編輯:關於C語言

sigsuspend 功能

int sigsuspend(const sigset_t *mask);
  • 以 mask 暫時替換進程信號遮罩
  • 暫停進程直到捕捉到信號
  • 信號處理函數返回後,恢復原遮罩並返回
  • 不可阻塞 SIGKILL/SIGSTOP

執行流程範例

sigset_t newmask, oldmask, zeromask;
sigemptyset(&zeromask);
sigemptyset(&newmask);
sigaddset(&newmask, SIGINT);  // 阻塞 SIGINT

sigprocmask(SIG_BLOCK, &newmask, &oldmask);  // 進入臨界區
// 臨界區程式碼...
sigsuspend(&zeromask);  // 開放所有信號並暫停
// 返回時已恢復 oldmask
sigprocmask(SIG_SETMASK, &oldmask, NULL);  // 確保恢復

原子操作內部流程 (核心視角)

  1. 設定新遮罩 mask,阻塞指定信號
  2. 進入 TASK_INTERRUPTIBLE 狀態
  3. 收到非阻塞/非忽略信號 → 喚醒
  4. 恢復原遮罩 saveset
  5. 呼叫信號處理函數 do_signal()
  6. 處理函數返回 → sigsuspend 返回 -EINTR

關鍵洞見

Stevens《UNIX 環境高級編程》指出:「若捕捉信號且處理函數返回,則 sigsuspend 返回且遮罩恢復為呼叫前狀態。」信號處理函數執行在遮罩恢復之後,屬於原子操作一部分。這解釋為何 sigsuspend 返回時遮罩已恢復,而處理函數內 pr_mask 仍顯示信號被阻塞。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved