Linux kernel add_timer



我正在为内核编写一个模块。我需要等待一段时间(例如; 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  

"计时器"是一个定义如下的结构

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 write ");"之后我想让进程等待 20 秒。消息"内部写入 2 "必须在 20 秒后写入消息"内部写入 1 "。我用了add_timer(和计时器);在他们之间,但它不起作用。我在终端中输入"dmesg",消息立即连续写入。

我希望我清楚地解释了我的问题:)谁能帮我?

两条消息是连续立即写入的,因为它们是连续的立即写入的。您正在编程计时器而不是延迟,因此 20 秒后内核运行 timer_handle() 函数,该函数在您的情况下为空。

如果您需要延迟某些代码执行,请阅读 Linux 设备驱动程序第 3 章第 7 章第 3 节

你打印错了,因为它是用户触发读取时的写入回调。

您想何时注册计时器?我不明白你为什么在写作中这样做。

该计时器应该定期定时还是根据某些事件触发器定时器?

最新更新