虚拟时间已过期

时间:2011-02-06 18:45:11

标签: c timer system-calls

我有以下代码,它会引发错误“虚拟时间已过期”。程序不应该在无限循环中运行吗?

#define KTHREAD_VTALRM_SEC 0
#define KTHREAD_VTALRM_USEC 100000
#include <stdio.h>
#include <unistd.h>
#include <linux/unistd.h>
#include <sys/syscall.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sched.h>
#include <signal.h>
#include <setjmp.h>
#include <errno.h>
#include <assert.h>
#include <string.h>

#include <time.h>
int main()

{
    struct itimerval timeslice;

    timeslice.it_interval.tv_sec = KTHREAD_VTALRM_SEC;
    timeslice.it_interval.tv_usec = KTHREAD_VTALRM_USEC;
    timeslice.it_value.tv_sec = KTHREAD_VTALRM_SEC;
    timeslice.it_value.tv_usec = KTHREAD_VTALRM_USEC;

    setitimer(ITIMER_VIRTUAL,&timeslice,NULL);

    while(1)
    {
        ;
    }
}

3 个答案:

答案 0 :(得分:2)

当计时器到期时,它将发出一个SIGVTALRM信号,你没有处理它。

请参阅setitimer()和signal()的手册页。

答案 1 :(得分:0)

您没有设置信号处理程序。

答案 2 :(得分:0)

VTALRM信号的默认处理程序是“exit”(ref:http://manpages.ubuntu.com/manpages//precise/en/man1/kill.1.html。)
因此,如果要用您的默认行为替换默认行为,则必须定义一个新的信号处理程序并对其进行注册:

void vtHandler(int sig)
{
  // Do something here
}

int main()
{
    // Register timer handler
    struct sigaction sa;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;
    sa.sa_handler = timer_handler;

    if (sigaction(SIGVTALRM, &sa, NULL) == -1)
        //error handle
        ;
}

PS:如果您使用signal方法,请确保它已在您的系统上得到很好的实施(参考:http://manpages.ubuntu.com/manpages//precise/en/man2/signal.2.html