为多个信号设置单个信号处理器功能的正确方法是什么?

时间:2010-10-24 16:20:20

标签: c posix signals

Linux上用于设置可以处理具有相同功能的多个POSIX信号的程序的最佳方法是什么?

例如在我的代码中,我有一个处理程序函数,我希望在捕获信号时执行某些操作时通常会调用它:

/* Exit handler function called by sigaction */
void exitHandler( int sig, siginfo_t *siginfo, void *ignore )
{
  printf("*** Got %d signal from %d\n", siginfo->si_signo, siginfo->si_pid);
  loopCounter=0;

  return;
}

我已经设置了两个信号来捕获每个信号的单独sigaction调用:

/* Set exit handler function for SIGUSR1 , SIGINT (ctrl+c) */
struct sigaction act;
act.sa_flags = SA_SIGINFO;
act.sa_sigaction = exitHandler;
sigaction( SIGUSR1, &act, 0 );
sigaction( SIGINT, &act, 0 );

这是设置此类处理的正确方法吗?有没有其他方法我不必枚举所有可能的信号?

3 个答案:

答案 0 :(得分:4)

“sigaction”系统调用的“signum”参数是一个整数值,它不能作为标志。

据我所知,在一次通话中无法为多个信号分配一个处理函数。

答案 1 :(得分:3)

我无法看到如何直接为所有信号设置单个处理程序。但是,您可以使用sigfillset()生成包含所有有效信号编号的集合,然后使用sigismember()迭代可能的信号编号以确定该编号是否为相当关闭在集合中,如果是这样设置处理程序。好的,我看不到确定最大可能信号数的方法,所以你可能需要猜出一个合适的最大值。

答案 2 :(得分:1)

  

这是设置此类处理的正确方法吗?

不完全 - it's not safe to use printf() inside a signal handler,但您仍然可以write()使用stdoutstderr