使用带有定时器信号的sigaction时遇到问题

时间:2011-03-15 19:13:08

标签: c

大家好 我正在尝试使用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()?

谢谢

2 个答案:

答案 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清除它。