C
如何安裝信號處理器 SIGUSR1 和 SIGUSR2?
預設情況下,使用者信號 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
它將儲存處理程序的舊值。第三個參數可以是NULL
if你不關心舊的價值。其中一個欄位
struct sigaction
是sa_handler
– 這是一個指向信號處理函式的指針。該函式的簽名必須是:void function_name(int signo);
該函式返回
void
並接受接收到的信號編號作為參數。綜上所述,該範例為 安裝一個信號處理程序
SIGUSR
,然後呼叫pause()
,這將暫停執行,直到收到任何信號。如果我隨後將SIGUSR
信號傳遞給執行此程式碼的程序,它將列印Signal received
到標準輸出。