sigsuspend

Function Prototype

int sigsuspend(const sigset_t *sigmask);

Function

  • 將 signal mask 設為 sigmask 後 pause 直到收到 signal
  • sigsuspend 會在收到 signal 並且 handler 後回傳才返回
  • 可以想成 sigprocmask 然後 pause 但是是 atomic operation
  • 此 system call 返回後會恢復原本的 signal mask

Why do we need sigsuspend?

if (sigprocmask(...) < 0)
	err_sys(...);
	
pause();
...

假設 sigprocmask unblock 了 SIGINT 然後我們希望 pause 直到 SIGINT 傳過來,但是如果在 sigprocmask 執行後 context switch,結果 SIGINT 在 pause 還沒執行前就 generate 並且 deliver,那麼 pause 可能就變成 forever blocking 了

而 sigsuspend 的 atomic 性質就可以避免這個問題