我正在为我的内核模块中的某些参数实现超时。
所以我使用struct timer_list
和Associated API来实现12秒计时器。
正如我在IBM开发人员使用的内核定时器指南中所提到的那样:
struct timer_list my_timer;
init_timer_on_stack(&my_timer);
void tick_timer()
{
my_timer.expires = jiffies + delay * HZ; //delay is global variable int = 12.
my_timer.data=0;
my_timer.function = my_timer_func;
add_timer(&my_timer);
}
因此,每次我的计时器到期时,我都会在my_timer_func
中完成工作并再次致电tick_timer
以重置计时器。
接下来,我想将delay
实现为sysctl条目。
但是更改应立即调用tick_timer
函数并使用新的delay
重置计时器。那我怎么能检测到这个变化并删除任何当前的计时器或重置它。
是否有任何内核线程可以检测delay
答案 0 :(得分:1)
内核没有检测变量变化的机制。相反,您应该在 代码更改您的变量之前/之后执行相应的操作。
添加sysctl条目时,还要为其设置处理程序(ctl_table->proc_handler
)。此处理程序定义在调用条目的读/写方法时执行的操作。标准proc_do*
函数只设置/获取变量的值,因此您应该定义您的处理程序。像这样:
int my_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
// Call standard helper..
int res = proc_dointvec(table, write, buffer, lenp, ppos);
if(write && !res) {
// Additional actions on successfull write.
}
return res;
}
可以使用mod_timer
功能修改计时器的超时。