【发布时间】:2018-04-20 09:25:45
【问题描述】:
我试图一次处理两个信号,为什么这不可能?
在这段代码中只有一个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);
}
}
【问题讨论】:
-
再次:每个信号每个进程最多有一个处理程序。第二个
sigaction()没有为 SIGALRM 设置“附加”信号处理程序;它只是为 SIGALRM 设置 信号处理程序。 -
你能帮我处理这段代码吗?
-
请注意,
printf()不是异步信号安全函数,不能在信号处理程序中安全使用。 -
传入传入传入signal2 signal2 signal2 /////////输出是这样的,如何触发两个警报并执行fun()?