C - linux中的进程处理任何信号

时间:2015-12-31 00:23:35

标签: c linux process signals

我正在编写代码,这些代码必须处理我给他的任何信号。我读到我应该做那样的事情

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

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

这是正确的解决方案吗?

2 个答案:

答案 0 :(得分:0)

如果您想使用相同的信号处理程序处理信号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)。该程序打印&#34;信号2被捕获!&#34;

Post-Facepalm编辑:这个程序显然需要用kill -9命令终止........

答案 1 :(得分:0)

虽然@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
  3. 等信号处理程序中使用任何非 Reentrant Async-signal-safe 函数的函数

    here

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

    POSIX.1-2004(也称为POSIX.1-2001技术勘误2)          需要一个实现来保证以下功能          可以在信号处理程序中安全地调用: