Linux - статьи


              

то оживить повествование замечу, что


Чтобы как- то оживить повествование замечу, что module_close не обладает монопольным правом на возобновление работы ожидающих процессов. Сигнал Ctrl-C (SIGINT) также может "разбудить" процесс. [12] В этом случае процессу немедленно возвращается -EINTR. Таким образом пользователи могут, например, прервать процесс прежде, чем он получит доступ к файлу.
Тут есть еще один момент, о котором хотелось бы упомянуть. Некоторые процессы не желают быть заблокированными, такие процессы должны либо получить в свое распоряжение открытый файл немедленно, либо извещение о том, что их запрос не может быть удовлетворен в настоящий момент. Такие процессы используют флаг O_NONBLOCK при открытии файла. Если ядро не в состоянии немедленно удовлетворить запрос, оно отвечает кодом ошибки -EAGAIN.
Пример 8-1. sleep.c
/* * sleep.c - Создает файл в /proc, доступ к * которому может получить только один процесс, * все остальные будут приостановлены. */
#include <linux/kernel.h> /* Все-таки мы работаем с ядром! */ #include <linux/module.h> /* Необходимо для любого модуля */ #include <linux/proc_fs.h> /* Необходимо для работы с /proc */ #include <linux/sched.h> /* Взаимодействие с планировщиком */ #include <asm/uaccess.h> /* определение функций get_user и put_user */
/* * Место хранения последнего принятого сообщения, * которое будет выводиться в файл, чтобы показать, что * модуль действительно может получать ввод от пользователя */ #define MESSAGE_LENGTH 80 static char Message[MESSAGE_LENGTH];
static struct proc_dir_entry *Our_Proc_File; #define PROC_ENTRY_FILENAME "sleep"
/* см. include/linux/fs.h */ static ssize_t module_output(struct file *file, /* буфер с данными (в пространстве пользователя) */ char *buf, /* размер буфера */ size_t len, loff_t * offset) { static int finished = 0; int i; char message[MESSAGE_LENGTH + 30];
/* * Для индикации признака конца файла возвращается 0. * В противном случае процесс будет продолжать читать из файла * угодив в бесконечный цикл. */ if (finished) { finished = 0; return 0; }

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