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 时此程序是 运行。内核向程序发送信号2SIGINT,并调用signalHandler(2)。该程序打印 "Signal 2 caught!"

Post-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. 切勿在信号处理程序中使用任何不是 ReentrantAsync-signal-safe 函数的函数,例如 printf

检查来自 here

的信号处理程序中允许的函数列表

POSIX.1-2004 (also known as POSIX.1-2001 Technical Corrigendum 2) requires an implementation to guarantee that the following functions can be safely called inside a signal handler: