gpt4 book ai didi

c - 为什么使用 timer_settime() 会影响 sleep() 函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:13:29 28 4
gpt4 key购买 nike

我正在尝试创建带有回调函数的周期性计时器,它运行良好。但是在 main() 中我有 sleep() 函数,它不能像往常一样工作。它不是休眠 10 秒,而是休眠 500 毫秒,这个时间是为 timer_settime() 函数设置的。这是错误还是正常行为?

volatile sig_atomic_t timer_flag = false;
volatile int total_cnt = 0;
timer_t gTimerid;

void start_timer(void)
{
struct itimerspec value;
value.it_value.tv_sec = 0;
value.it_value.tv_nsec = 500000000;
value.it_interval.tv_sec = 0;
value.it_interval.tv_nsec = 500000000;
timer_create(CLOCK_REALTIME, NULL, &gTimerid);
timer_settime(gTimerid, 0, &value, NULL);
}

void stop_timer(void)
{
struct itimerspec value;
value.it_value.tv_sec = 0;
value.it_value.tv_nsec = 0;
value.it_interval.tv_sec = 0;
value.it_interval.tv_nsec = 0;
timer_settime(gTimerid, 0, &value, NULL);
}

void timer_callback(int sig)
{
timer_flag = true;
}

static void *count(void *ptr)
{
for(;;) {
if(timer_flag == true) {
timer_flag = false;
printf("%d\n", total_cnt++);
}
usleep(1000);
}

return NULL;
}

int main(void)
{
(void) signal(SIGALRM, timer_callback);
start_timer();

pthread_t thread_cnt;
int thread_num = 1;

pthread_create(&thread_cnt, NULL, count, (void*)&thread_num);

clock_t begin, end;
double time_spent;
struct timeval tv1, tv2;

for(;;) {
printf("Main loop\n");
gettimeofday(&tv1, NULL);
sleep(10);
gettimeofday(&tv2, NULL);
printf ("Total time = %f seconds\n",
(double) (tv2.tv_usec - tv1.tv_usec) / 1000000 +
(double) (tv2.tv_sec - tv1.tv_sec));
}

return 0;
}

最佳答案

这是正常的(=按标准工作)。 sleep 是一个可中断的阻塞函数。

Here's what POSIX says about it:

If sleep() returns because the requested time has elapsed, the value returned shall be 0. If sleep() returns due to delivery of a signal, the return value shall be the "unslept" amount (the requested time minus the time actually slept) in seconds.

如果你想不间断地休眠,你需要阻塞信号(或者你需要在第一次调用被打断后的剩余时间内再次休眠,但你可能需要更高分辨率的休眠函数,例如 nanosleepclock_nanosleep )。

关于c - 为什么使用 timer_settime() 会影响 sleep() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57574373/

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