gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:07:59 31 4
gpt4 key购买 nike

我试图同时处理两个信号,为什么这不可能?

在这段代码中只有一个信号在触发,代码有什么问题?

//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 不可能对同一信号进行两种处理。当内核收到第二个 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在信号处理程序上下文中。

关于c - 如何使用 struct sigaction 和 struct itimerval 一次处理两个信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49938361/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com