Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 捕捉信号_C++_Signals - Fatal编程技术网

C++ 捕捉信号

C++ 捕捉信号,c++,signals,C++,Signals,我正在尝试捕获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;

我正在尝试捕获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;
}
出于某种原因,它从不调用时间——是因为它没有捕捉到信号,还是因为信号一开始就没有发出,我不知道


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

您确定它不起作用吗

我觉得一切都很好。也许你等待的时间不够。由于您正在打印循环中等待的字符串,并且您正在使用虚拟计时器,因此,时钟只在进程运行IO时滴答作响,不包括IO时间。因此,实际上,计时器可能会在几秒钟>5秒后过期


请尝试注释打印部分。

您确定打印部分不工作吗

我觉得一切都很好。也许你等待的时间不够。由于您正在打印循环中等待的字符串,并且您正在使用虚拟计时器,因此,时钟只在进程运行IO时滴答作响,不包括IO时间。因此,实际上,计时器可能会在几秒钟>5秒后过期

尝试注释打印部分。

这是由于信号功能。如中所述:

因此,主要的方法应该是:

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;
}
这是由于信号功能。如中所述:

因此,主要的方法应该是:

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;
}

你的意思是它不起作用?这有点笼统:没错,我已经编辑了这个问题。它永远不会进入时间,所以我认为它可能没有捕捉到信号你的意思是它不起作用?这有点笼统:没错,我已经编辑了这个问题。它从不进入时间,所以我认为它可能没有捕捉到信号