int sigsuspend(const sigset_t *mask);
mask 暫時替換進程信號遮罩SIGKILL/SIGSTOPsigset_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); // 確保恢復
mask,阻塞指定信號TASK_INTERRUPTIBLE 狀態savesetdo_signal()sigsuspend 返回 -EINTRStevens《UNIX 環境高級編程》指出:「若捕捉信號且處理函數返回,則 sigsuspend 返回且遮罩恢復為呼叫前狀態。」信號處理函數執行在遮罩恢復之後,屬於原子操作一部分。這解釋為何 sigsuspend 返回時遮罩已恢復,而處理函數內 pr_mask 仍顯示信號被阻塞。