簡體   English   中英

C-linux進程中的進程帶有任何信號

[英]C - Processes in linux handle with any signal

我正在編寫具有流程的代碼,這些流程必須處理我給他的任何信號。 我讀到我應該做這樣的事情

void signalHandler(int sig_num)
{
    // some stuff
}

//My process
int i;
for (i = 1; i <= 64; i++)
     signal(i, signalHandler);

這是正確的解決方案嗎?

如果您要使用相同的信號處理程序來處理信號1到64,您將走在正確的軌道上。 該測試程序將通過打印其編號來處理信號1到64。

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

void signalHandler(int sig_num)
{
    printf("Signal %d caught!\n", sig_num);
}

int main(int argc, char const *argv[])
{
    //My process
    int i;
    for (i = 1; i <= 64; i++) {
        signal(i, signalHandler);
    }

    while (1);
    return 0;
}

例如,當您在運行該程序時按CTRL + C。 內核將信號2 SIGINT發送到程序,並調用signalHandler(2) 該程序打印“信號2被捕獲!”。

Facepalm編輯:該程序顯然需要使用kill -9命令終止........

雖然@Dylan的解決方案看起來不錯,但確實存在一個普遍的問題,那就是與signal功能的兼容性問題。 因此,建議您始終使用sigaction 這是一個例子

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

static void handler(int signo){
   write(stdout, &signo, sizeof(int));
}

int main() {
   struct sigaction sa;
   sa.sa_handler = handler;
   int i;
   for (i = 1; i <= 64; i++) {
        sigaction(i, &sa, NULL);
   }
   while(1);
  return 0;
}
  1. 盡量避免使用signal
  2. 切勿在信號處理程序(如printf使用任何非可重入函數或異步信號安全函數

此處檢查信號處理程序中允許的功能列表

POSIX.1-2004(也稱為POSIX.1-2001技術勘誤2)要求實現以確保可以在信號處理程序中安全地調用以下功能:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM