C
為什麼下面的程式碼無法解鎖 SIGINT 信號
我正在嘗試使用 Linux Signals。我創建了一個下面提到的場景:
- 最初使用 阻止所有
SIGINT
信號sigprocmask()
。- 如果發送方發送
SIGUSR1
信號,則在剩餘的程序生命週期中解除阻塞SIGINT
。但是第一步已成功實施,但無法使用
sigprocmask()
.我究竟做錯了什麼?
#include<stdio.h> #include<signal.h> #include<stdlib.h> sigset_t block_list, unblock_list; void sigint_handler(int sig) { printf("Ouch!!\n"); } void sigusr1_handler(int sig) { sigemptyset(&unblock_list); sigprocmask(SIG_SETMASK, &unblock_list, NULL); } int main(int argc, char **argv) { int count; signal(SIGINT, &sigint_handler); signal(SIGUSR1, &sigusr1_handler); sigemptyset(&block_list); sigaddset(&block_list, SIGINT); sigprocmask(SIG_SETMASK, &block_list, NULL); for(count=1; ;++count) { printf("Process id: %ld\t%d\n", (long)getpid(), count); sleep(4); } exit(EXIT_SUCCESS); }
$kill -n SIGINT <pid> $kill -n SIGUSER1 <pid> //This call should unblock sigint_handler() for rest of the process life, but it is only unblocking for one time. Everytime I have call $kill -n SIGUSER1 <pid> to unblock SIGINT.
注意:為簡單起見,已刪除錯誤處理。
從信號處理程序返回後,核心將恢復信號遮罩。這是由標準規定的:
當執行緒的信號遮罩在由 安裝
sigaction()
的信號擷取函式中更改時,從信號擷取函式返回時恢復信號遮罩會覆蓋該更改(請參閱 參考資料sigaction()
)。如果安裝了信號擷取功能signal()
,則未指定是否發生這種情況。在 Linux 上,
signal(2)
它只是一個已棄用的兼容包裝器sigaction(2)
,在使用signal(2)
.