首页 > 解决方案 > Linux/POSIX:timer_settime - 无法从定时器生成的线程中解除定时器

问题描述

我正在尝试解除计时器但无法解除。下面是将由 glibc 调用的处理程序的片段(假设在单独的线程上下文中)。线程调用 disarm_timer(最终调用 timer_settime)。但是,它失败了,因为 INVALID ARGUMENT 设置了一个 errno。如果我直接从处理程序调用 timer_settime,那么它工作正常。可能是什么问题呢 ?重新武装时间工作正常。

timer_t timerid;

static void t_thread(union sigval sig)
 {
     if (disarm_timer(timerid) < 0) {
         printf("Bad\n");
     } else {
         printf("Done\n");
     } 
     sleep(10);
     (void)rearm_timer(timerid, 2, 0);
 }

int disarm_timer(timer_t timerid)
 {
     struct itimerspec time_spec; 
     time_spec.it_value.tv_sec = 0;
     time_spec.it_value.tv_nsec = 0;

     if (timer_settime(timerid, 0, &time_spec, NULL) < 0) {
         return -1;
     }
     return 0;
 }

 int rearm_timer(timer_t timerid, time_t tv_sec, long tv_nsec)
 {
     struct itimerspec time_spec;

     if (!timerid) {
         return -1;
     }

     time_spec.it_value.tv_sec = tv_sec;
     time_spec.it_value.tv_nsec = tv_nsec;

     time_spec.it_interval.tv_sec = tv_sec;
     time_spec.it_interval.tv_nsec = tv_nsec;

     if (timer_settime(timerid, 0, &time_spec, NULL) < 0) {
         return -1;
     }
     return 0;
 }

标签: clinuxtimer

解决方案


推荐阅读