单信号处理函数有多个信号的正确方法是什么?

问题描述:

Linux上用C语言建立一个能处理多个具有相同功能的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); 

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

我看不出你如何能直截了当地设置一个处理程序所有信号。但是,您可以关闭使用sigfillset()以生成一个包含所有有效信号的数字一组,然后用sigismember(),以确定号码是否是集合了可能的信号数字迭代,并设置一个处理程序,如果因此得到相当。好的,我看不到确定最大可能信号数量的方法,因此您可能需要猜测合适的最大值。

+0

谢谢,这是一个好主意。我想我可以继续列举我想要捕捉的信号,因为我对C很陌生,如果我错过了某些东西,我很好奇。 – ammianus 2010-10-25 19:58:24

“正负号”“的sigaction”系统调用的参数是一个整数值,它不作为一个标志工作。

据我所知,有没有办法在一个呼叫分配一个处理函数的几个信号。

+0

谢谢你明确的答复。 – ammianus 2010-10-25 19:58:51

这是正确的方式来建立这种类型的处理?

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