Linux - статьи


              

и никогда не вызовет функцию


for (i = 0; i < _NSIG_WORDS && !is_sig; i++) is_sig = current->pending.signal.sig[i] & ~current-> blocked.sig[i];
if (is_sig) { /* * Не забыть вызвать здесь module_put(THIS_MODULE), * поскольку процесс был прерван * и никогда не вызовет функцию close. * Если не уменьшить счетчик обращений, то он навсегда останется * больше нуля, в результате модуль можно будет * уничтожить только при перезагрузке системы */ module_put(THIS_MODULE); return -EINTR; } }
/* * В этой точке переменная Already_Open должна быть равна нулю */
/* * Открыть файл */ Already_Open = 1; return 0; }
/* * Вызывается при закрытии файла */ int module_close(struct inode *inode, struct file *file) { /* * Записать ноль в Already_Open, тогда один * из процессов из WaitQ * сможет записать туда единицу и открыть файл. * Все остальные процессы, ожидающие доступа * к файлу опять будут приостановлены */ Already_Open = 0;
/* * Возобновить работу процессов из WaitQ. */ wake_up(&WaitQ);
module_put(THIS_MODULE);
return 0; }
/* * Эта функция принимает решение о праве на выполнение операций с файлом * 0 -- разрешено, ненулеое значение -- запрещено. * * Операции с файлом могут быть: * 0 - Исполнениеe (не имеет смысла в нашей ситуации) * 2 - Запись (передача от пользователя к модулю ядра) * 4 - Чтение (передача от модуля ядра к пользователю) * * Эта функция проверяет права доступа к файлу * Права, выводимые командой ls -l * могут быть проигнорированы здесь. */ static int module_permission(struct inode *inode, int op, struct nameidata *nd) { /* * Позволим любому читать файл, но * писать -- только root-у (uid 0) */ if (op == 4 (op == 2 && current->euid == 0)) return 0;
/* * Если что-то иное -- запретить доступ */ return -EACCES; }
/* * Указатели на функции-обработчики для нашего файла. */ static struct file_operations File_Ops_4_Our_Proc_File = { .read = module_output, /* чтение из файла */ .write = module_input, /* запись в файл */ .open = module_open, /* открытие файла */ .release = module_close, /* закрытие файла */ };

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