Linux - статьи


              

Приостановить работу, пока intrpt_routine не


/* * Заполнить буфер и получить его длину */ len = sprintf(my_buffer, "Timer called %d times so far\n", TimerIntrpt); count++;
/* * Указать адрес буфера */ *buffer_location = my_buffer;
/* * Вернуть длину буфера */ return len; }
/* * Функция инициализации - зарегистрировать файл в /proc */ int __init init_module() { int rv = 0; /* * Создать очередь задач с нашей задачей и поместить ее в очередь таймера */ my_workqueue = create_workqueue(MY_WORK_QUEUE_NAME); queue_delayed_work(my_workqueue, &Task, 100);
Our_Proc_File = create_proc_entry(PROC_ENTRY_FILENAME, 0644, NULL); Our_Proc_File->read_proc = procfile_read; Our_Proc_File->owner = THIS_MODULE; Our_Proc_File->mode = S_IFREG | S_IRUGO; Our_Proc_File->uid = 0; Our_Proc_File->gid = 0; Our_Proc_File->size = 80;
if (Our_Proc_File == NULL) { rv = -ENOMEM; remove_proc_entry(PROC_ENTRY_FILENAME, &proc_root); printk(KERN_INFO "Error: Could not initialize /proc/%s\n", PROC_ENTRY_FILENAME); }
return rv; }
/* * Завершение работы */ void __exit cleanup_module() { /* * Удалить файл из /proc */ remove_proc_entry(PROC_ENTRY_FILENAME, &proc_root); printk(KERN_INFO "/proc/%s removed\n", PROC_ENTRY_FILENAME); /* Известить функцию обработки прерываний о завершении работы */ die = 1; cancel_delayed_work(&Task); flush_workqueue(my_workqueue); /* ждать пока отработает таймер */ destroy_workqueue(my_workqueue);
/* * Приостановить работу, пока intrpt_routine не * отработает в последний раз. * Это необходимо, поскольку мы освобождаем память, * занимаемую этой функцией. */
}
/* * некоторые функции, относящиеся к work_queue * доступны только если модуль лицензирован под GPL */ MODULE_LICENSE("GPL");

Содержание  Назад  Вперед