大家好 我正在尝试使用sigaction()但是没有成功 这是我的代码:
int main()
{
struct sigaction act, oact;
act.sa_handler = (void *)g;
sigaction(SIGVTALRM,&act,&oact);
struct itimerval tv;
tv.it_value.tv_sec = 2; //time of first timer
tv.it_value.tv_usec = 0; //time of first timer
tv.it_interval.tv_sec = 2; //time of all timers but the first one
tv.it_interval.tv_usec = 0; //time of all timers but the first one
setitimer(ITIMER_VIRTUAL, &tv, NULL);
for (;;);
}
这是g():
void g( void ){
printf("I'M NOT IN G!!");
for (;;);
}
当我运行代码时,我陷入第一个for(;;)循环而没有得到g()。 如果我把它定义为处理信号的函数,为什么不到g()?
谢谢
答案 0 :(得分:1)
首先,您应该确保输入struct sigaction
结构是干净的:
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
act.sa_handler = g;
然后,您应该暂停该过程,而不是使用for循环"旋转等待":
sigset_t mask;
sigprocmask(0, NULL, &mask);
sigdelset(&mask, SIGVTALRM);
sigsuspend(&mask);
最后,您的信号处理程序应该正确定义,而不是使用printf()函数,这在信号存在时被认为是不安全的,不应该在信号处理程序中使用。相反,它应该设置一个原子标志:
static volatile sig_atomic_t g_called;
void g(int sig) {
g_called = 1;
}
答案 1 :(得分:0)
根本问题在于您使用的是未初始化的sigaction
结构。用以下内容初始化:
struct sigaction act = {0};
或在调用memset
之前使用sigaction
清除它。