首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >捕获SIGVTALRM信号

捕获SIGVTALRM信号
EN

Stack Overflow用户
提问于 2012-04-26 17:38:41
回答 2查看 3.3K关注 0票数 2

我正在尝试捕获setitimer发送的SIGVTALRM,但我不知道为什么它不能工作。下面是我的代码:

代码语言:javascript
运行
复制
void time(int time) {
    cout << "time" << endl;
    exit(0);
}

int main(void) {
    signal(SIGVTALRM, time);
    itimerval tv;
    tv.it_value.tv_sec = 5;
    tv.it_value.tv_usec = 0;
    tv.it_interval.tv_sec = 5;
    tv.it_interval.tv_usec = 0;
    setitimer(ITIMER_VIRTUAL, &tv, NULL);
    while (true) {
        cout << "waiting" << endl;
    }
    return 0;
}

出于某种原因,它从不调用time() -是因为它没有捕捉到信号,还是因为信号不是在第一个地方发送的,我不知道。

这应该很简单。有什么想法吗?谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-26 18:05:17

你确定它不工作吗?

在我看来一切都很好。也许你等待的还不够多。由于您在循环内打印字符串waiting,并且使用虚拟计时器,因此时钟仅在进程运行时计时(不包括IO时间)。所以在现实中,你的计时器可能会在几秒钟(>5秒)后到期。

试着注释掉打印部分。

票数 0
EN

Stack Overflow用户

发布于 2014-01-16 12:22:51

这是由于signal函数造成的。正如在http://manpages.ubuntu.com/manpages//precise/en/man2/signal.2.html中提到的:

代码语言:javascript
运行
复制
The  behavior  of  signal()  varies  across UNIX versions, and has also varied historically across different versions of Linux.  Avoid its use: use sigaction(2) instead.

所以主要的方法应该是:

代码语言:javascript
运行
复制
int main(void) {
    itimerval tv;
    struct sigaction sa;

    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;
    sa.sa_handler = timer_handler;
    if (sigaction(SIGVTALRM, &sa, NULL) == -1) {
        printf("error with: sigaction\n");
        exit(EXIT_FAILURE);
    }

    tv.it_value.tv_sec = 5;
    tv.it_value.tv_usec = 0;
    tv.it_interval.tv_sec = 5;
    tv.it_interval.tv_usec = 0;
    setitimer(ITIMER_VIRTUAL, &tv, NULL);

    while (true) {
        cout << "waiting" << endl;
    }

    return 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10330837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档