如何使用虚拟计时器sigsuspend

时间:2013-12-12 21:29:42

标签: c timer signals

我想使用虚拟计时器暂停while循环,直到计时器到期。目标是在给定时间间隔的情况下定期运行函数。 我在gnu.org网站上看到使用pause()可能很麻烦,他们建议使用sigsuspend代替。我正在使用示例中给出的代码。我的程序如下所示。

void handler_SIGALRM(int signo)
{
signo = 0; /* Get rid of warning "unused parameter ‘signo’" (in a portable way). */
puts("        ***********Cleared Alarm");
return;
}

int main(int argc, char *argv[]) {

struct sigaction sa;
memset(&sa, 0, sizeof(sa));
sa.sa_handler = handler_SIGALRM;
if (-1 == sigaction(SIGALRM, &sa, NULL ))
{
    perror("sigaction() failed");
    exit(EXIT_FAILURE);
}

struct itimerval it_val;    /* for setting itimer */

it_val.it_value.tv_sec = 3;   // INTERVAL/1000;
it_val.it_value.tv_usec = 0;//simData.misc
it_val.it_interval = it_val.it_value;

if (setitimer(ITIMER_REAL, &it_val, NULL) == -1) {
    perror("error calling setitimer()");
    exit(1);
}

sigset_t mask, oldmask;
sigemptyset(&mask);
sigaddset(&mask,SIGALRM);

/* Wait for a signal to arrive. */
sigprocmask(SIG_BLOCK, &mask, &oldmask);
sigsuspend(&oldmask);
sigprocmask(SIG_UNBLOCK, &mask, NULL);
puts("unblocked");

sigprocmask(SIG_BLOCK, &mask, &oldmask);
while(1)
{
    //...
    sigsuspend(&oldmask);
    //...

}
sigprocmask(SIG_UNBLOCK, &mask, NULL);
return 0;

}

上面的代码完成了我需要的“暂停”。但是,当我运行它嵌入另一个程序(线程)。它只是挂起,只是一直调用_handler_SIGALRM_。 难道我做错了什么?为什么我的程序会被挂起?

0 个答案:

没有答案