Add_timer ядра Linux

Пишу модуль для ядра. Мне нужно подождать какое-то время (например, 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 \ n ");" Я хочу, чтобы процесс ожидал 20 секунд. Сообщение «Внутри записи 2 \ n» должно быть написано через 20 секунд после записи «Внутри записи 1 \ n». Я использовал add_timer (& timer); между ними, но это не работает. Я ввожу "dmesg" в терминал, и сообщения сразу же пишутся последовательно.

Надеюсь, я ясно объяснил свою проблему :) Кто-нибудь может мне помочь?


person Jemo    schedule 17.05.2012    source источник


Ответы (2)


Два сообщения записываются сразу последовательно, потому что они пишутся сразу же последовательно. Вы программируете таймер, а не задержку, поэтому через 20 секунд ядро ​​запускает функцию timer_handle (), которая в вашем случае пуста.

Если вам нужно отложить выполнение кода, прочтите Драйвер устройства Linux 3-е, главу 7 Раздел 3

person Federico    schedule 05.08.2012

вы печатаете его неправильно, так как это обратный вызов записи, когда пользователь запускает чтение.

когда вы хотите зарегистрировать таймер? Я не мог понять, почему вы пишете.

это таймер должен таймером периодически или на основе какого-либо триггера события?

person John    schedule 13.03.2013