虚拟时间已过

发布于 2024-10-15 21:43:35 字数 878 浏览 6 评论 0原文

我有以下代码,它会引发错误

虚拟时间已过期。

程序不应该无限循环运行吗?

#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)
    {
        ;
    }
}

I have the following code, which throws the error

Virtual time expired.

Shouldn't the program run in an infinite loop?

#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,×lice,NULL);

    while(1)
    {
        ;
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

安人多梦 2024-10-22 21:43:35

当计时器到期时,它将发送一个 SIGVTALRM 信号,但您不会处理该信号。

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

When the timer expires it will deliver a SIGVTALRM signal, which you are not handling.

See the man pages for setitimer() and signal().

是你 2024-10-22 21:43:35

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

You did not set a signal handler.

此刻的回忆 2024-10-22 21:43:35

VTALRM 信号的默认处理程序是“exit”(参考: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//精确/en/man2/signal.2.html

The default handler for VTALRM signal is "exit" (ref: http://manpages.ubuntu.com/manpages//precise/en/man1/kill.1.html.)
So if you want to replace the default behavior with yours, you have to define a new signal handler and register it:

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: If you utilize signal method, sure that it is well implemented on your system (ref: http://manpages.ubuntu.com/manpages//precise/en/man2/signal.2.html)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文