C

為什麼下面的程式碼無法解鎖 SIGINT 信號

  • December 3, 2019

我正在嘗試使用 Linux Signals。我創建了一個下面提到的場景:

  1. 最初使用 阻止所有SIGINT信號sigprocmask()
  2. 如果發送方發送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).

引用自:https://unix.stackexchange.com/questions/543198