C

如何安裝信號處理器 SIGUSR1 和 SIGUSR2?

  • November 7, 2019

預設情況下,使用者信號 SIGUSR1 和 SIGUSR2 終止程序或執行緒。如何讓他們設置他們的處理程序?我嘗試閱讀有關該主題的各種文章,但由於我是該主題的新手,因此無法根據我的需要進行轉移。

並且需要如下 - 有許多生產者執行緒(pthread)在循環中執行一系列指令,並且在每次迭代結束時,它們等待來自主消費者執行緒的信號(sigwait)SIGURS1,並且只有收到信號後進行下一次迭代。但是由於預設完成,因此它們已完成。

那些。在這裡,我們只需要接收這些信號就可以過渡到下一次迭代,它們就完成了整個過程。

有許多 API 可以設置信號處理程序,我將說明其中一個:

#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

static void signal_handler(int signo)
{
#       define signal_message "Signal received\n"
       write(1, signal_message, strlen(signal_message));
#       undef signal_message
}

int main(void)
{
       struct sigaction new_handler = {
               .sa_handler = signal_handler,
       };

       if (sigaction(SIGUSR1, &new_handler, NULL) < 0) {
               perror("sigaction");
       }

       pause();

       return 0;
}

sigaction()函式可以安裝新的信號處理程序,它的簽名是:

int sigaction(int signum,
             const struct sigaction *act,
             struct sigaction *oldact);

第一個參數是信號編號(例如,SIGUSR1第二個參數是指向struct sigaction具有處理細節的結構的指針,第三個是指向 a 的指針,struct sigaction它將儲存處理程序的舊值。第三個參數可以是NULLif你不關心舊的價值。

其中一個欄位struct sigactionsa_handler– 這是一個指向信號處理函式的指針。該函式的簽名必須是:

void function_name(int signo);

該函式返回void並接受接收到的信號編號作為參數。

綜上所述,該範例為 安裝一個信號處理程序SIGUSR,然後呼叫pause(),這將暫停執行,直到收到任何信號。如果我隨後將SIGUSR信號傳遞給執行此程式碼的程序,它將列印Signal received到標準輸出。

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