我试图一次处理两个信号,为什么这是不可能的?
在这段代码中只有一个sinal正在触发,代码的问题是什么?
//signal handler
void fun(int sig, siginfo_t *siginfo,void *ptr)
{
printf("si_code=%d\n",siginfo->si_code);
printf("siGNO1=%d\n",siginfo->si_signo);
printf("incoming\n");
}
void fun2(int sig,siginfo_t *siginfo,void *ptr)
{
printf("si_fd=%d\n",siginfo->si_fd);
printf("signal2\n");
}
int main()
{
struct sigaction sig; //sigaction
sig.sa_sigaction=fun;
sig.sa_flags=SA_SIGINFO;
alarm(1);
sigaction(SIGALRM,&sig,NULL);
struct itimerval tim;
struct sigaction sig2;
memset(&sig2,0,sizeof(sig2));
sig2.sa_sigaction=fun2;
sig2.sa_flags=SA_SIGINFO;
tim.it_value.tv_sec=1;
tim.it_interval.tv_sec=1;
tim.it_value.tv_usec=1;
tim.it_interval.tv_usec=2;
sigaction(SIGALRM,&sig2,NULL);
setitimer(ITIMER_REAL,&tim,NULL);
while(1)
{
sleep(1);
}
}
答案 0 :(得分:0)
使用sigaction对同一信号进行两次配置是不可能的。当内核收到第二个sigaction()请求时,它只是将第一个处置替换为第二个处理。但是,如果您的目的是处理当程序接收SIGALRM时执行h1()的情况,并且在计时器到期时执行H2()处理程序,那么当然可以使用timer_create()来处理它。
想法是:
SIGEV_THREAD
Upon timer expiration, invoke sigev_notify_function as if it were the start function of a new thread. See sigevent(7) for details.
始终在信号处理程序上下文中使用async-signal-safe functions。