gpt4 book ai didi

c++ - setitimer 信号似乎只在 fork 之后才有效

转载 作者:太空宇宙 更新时间:2023-11-04 09:38:37 26 4
gpt4 key购买 nike

我想使用以下 C++ 代码等待预定义的时间(在此示例中始终为 2 秒),但仍可被信号中断(这就是我不使用 sleep 的原因):

#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/time.h>
#include <signal.h>
#include <iostream>

using namespace std;

int measure() {
itimerval idle;
sigset_t sigset;
int sig;

idle.it_value.tv_sec = 2;
idle.it_value.tv_usec = 0;
setitimer(ITIMER_REAL, &idle, NULL); // TODO: check return value

sigemptyset(&sigset);
sigaddset(&sigset, SIGALRM); // TODO return values
sigaddset(&sigset, SIGUSR1);

sigprocmask(SIG_BLOCK, &sigset, NULL); // TODO return value?
sigwait(&sigset, &sig); // TODO check return value
while(sig != SIGUSR1) {
cout << "Hohoho" << endl;

idle.it_value.tv_sec = 2;
idle.it_value.tv_usec = 0;
setitimer(ITIMER_REAL, &idle, NULL); // TODO: check return value
sigwait(&sigset, &sig); // TODO check return value
}

cout << "Done with measurements." << endl;
return 0;
}

int main(int argc, char **argv) {
//if(fork() != 0) exit(0);
//if(fork() == 0) exit(0);
return measure();
}

我希望这段代码每 2 秒打印一次“Hohoho”,直到它收到 SIGUSR1。然后它打印“完成测量”。并退出。第二部分按预期工作。但是,我看不到“Hohoho”,所以在我看来,未收到来自 setitimer 的 SIGALRM。奇怪的是,如果我之前做了一个 fork,程序会按预期工作。更具体地说,如果我在最后取消注释两个 fork 命令中的任何一个,它就会起作用。因此,它不取决于它是父进程还是子进程,但不知何故 fork 事件很重要。有人可以向我解释发生了什么以及如何修复我的代码吗?

非常感谢,卢茨

最佳答案

(1) 您的 setitimer 失败,因为您没有正确设置它。结构 itimerval 包含两个类型为 timeval 的结构。您只需设置一个,从而在声明 idle 时拾取本地存储中的任何垃圾。

       struct itimerval {
struct timeval it_interval; /* next value */
struct timeval it_value; /* current value */
};

struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};

如果您想要每 2 秒重复一次计时器,则将第二组设置为使用相同的值重复。

  idle.it_value.tv_sec  = 2;
idle.it_value.tv_usec = 0;
idle.it_interval.tv_sec = 2;
idle.it_interval.tv_usec = 0;

关于c++ - setitimer 信号似乎只在 fork 之后才有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23728706/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com