我正在为内核编写一个模块。我需要等待一段时间(例如; 20秒)才能测试一些东西。过程应该在20秒后继续。在我的module_init函数中,我使用了这样的计时器:
init_timer(&timer);
timer.expires = jiffies + HZ*20;//timer expires in delay ticks
timer.data = 0;//zero is passed to the timer handler
timer.function = timer_handle;//function to run when timer expires
“timer”是一个像
那样定义的结构static struct timer_list timer;
timer_handle是我在计时器到期时运行的函数:
void timer_handle (unsigned long data){
}
现在我的职能:
ssize_t write(struct file *filp, const char *buff, size_t count, loff_t *offp) {
unsigned long ret;
printk(KERN_INFO "pid : .%d \n", task->pid);
down_write(&rwsem);
if ( (filp->f_flags & O_ACCMODE) == O_RDONLY)
{
printk(KERN_INFO "The reader thread is not able to write. \n");
return -EINVAL;
}
printk(KERN_INFO "Inside write 1 \n");
add_timer(&timer);
ret = copy_from_user(bufferr, buff, count);
up_write(&rwsem);
printk("Inside write 2 \n");
return count;
}
“printk(KERN_INFO”Inside inside \ n“)之后;”我想让进程等待20秒。消息“Inside write 2 \ n”必须在20秒后写入“Inside write 1 \ n”信息。我用过add_timer(& timer);他们之间但它不起作用。我在终端输入“dmesg”,并立即连续写入消息。
我希望我能清楚地解释我的问题:)有人可以帮助我吗?
答案 0 :(得分:2)
连续立即连续写两条消息,因为它们连续。你正在编程一个计时器而不是延迟,所以内核运行 timer_handle()函数20秒后,在你的情况下是空的。
如果您需要延迟一些代码执行,请阅读Linux Device Driver 3th第7章第3节
答案 1 :(得分:1)
你打错了,因为它是用户触发读取时的写回调。
您想何时注册计时器?我无法理解为什么你在写作。
是定时器应定期定时还是基于某些事件触发器?