【问题标题】:How to handle two signals at one time using struct sigaction and struct itimerval?如何使用 struct sigaction 和 struct itimerval 一次处理两个信号?
【发布时间】: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()?

标签: c linux function signals


【解决方案1】:

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

see this example as reference

想法是:

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

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。

始终在信号处理程序上下文中使用async-signal-safe functions

【讨论】:

  • tq Vadim Kotov :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-24
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多