c - 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;
}
解决方案
推荐阅读
- laravel - 如何在 Laravel 的选项字段中显示旧值?
- java - Java Repeatable annotation not recognized when it's only one parameter
- python - 在未传播的函数中修改数据框
- javascript - 条件脚本/样式编码
- java - 我应该如何引用 Java 中“祖父母”类的函数/void?
- python - Python for 循环仅返回第一个元素
- java - Android:传递允许recyclerview由特定字符串填充的变量
- javascript - How do I create an edit function inside of a list?
- bash - 重复 IF 语句,直到满足条件
- php - 我的 JQUERY AJAX 成功功能不起作用