捕获SIGVTALRM信号,cp

Catching SIGVTALRM signal, cp

本文关键字:cp 信号 SIGVTALRM 捕获      更新时间:2023-10-16

我正在尝试捕获setitimer发送的SIGVTALRM,但我不知道为什么它不起作用。 这是我的代码:

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() - 是因为它没有捕获信号还是因为我不知道信号首先没有发送。

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

你确定它不起作用吗?

对我来说,一切看起来都很好。可能是你等得不够。由于您正在循环内打印字符串waiting并且使用的是虚拟计时器,因此时钟仅在进程运行时滴答作响(不包括 IO 时间)。因此,实际上您的计时器可能会在几 (>5) 秒后过期。

尝试注释掉打印部分。

这是

由于signal函数。如 http://manpages.ubuntu.com/manpages//precise/en/man2/signal.2.html 所述:

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.

所以主要方法应该是:

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: sigactionn");
        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;
}