如何使用struct sigaction和struct itimerval一次处理两个信号?

时间:2018-04-20 09:25:46

标签: c linux function signals

我试图一次处理两个信号,为什么这是不可能的?

在这段代码中只有一个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);
    }
}

1 个答案:

答案 0 :(得分:0)

使用sigaction对同一信号进行两次配置是不可能的。当内核收到第二个sigaction()请求时,它只是将第一个处置替换为第二个处理。但是,如果您的目的是处理当程序接收SIGALRM时执行h1()的情况,并且在计时器到期时执行H2()处理程序,那么当然可以使用timer_create()来处理它。

see this example as reference

想法是:

  1. 使用sigaction()安装SIGALRM处理程序。
  2. 使用timer_create()setitimer()创建计时器。使用SIGEV_THREAD作为计时器到期的通知。
  3.   

    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.
    
    1. 现在当alarm()到期时,SIGALRM处理程序将被执行,并且在计时器到期时,将执行sigev_notify_function。
    2. 始终在信号处理程序上下文中使用async-signal-safe functions