У меня есть простой модуль ядра, который создает символьные устройства и ничего с ним не делает.
Я написал эту программу пользовательского пространства, которая тестирует символьное устройство.
int main()
{
int fd;
fd = open("/dev/ebbchar", O_RDWR);
if (fd < 0)
err(1, "open");
sleep(10);
ret = close(fd);
if (ret < 0)
err(1, "close");
}
Программа завершается через 10 секунд.
Но если тем временем я удаляю модуль с помощью rmmod или modprobe, то через 10 секунд программа отключается или зависает, и ядро перестает работать.
Как я могу вызвать сбой rmmod или есть способ безопасно удалить модуль?
Может ли мой модуль в своей функции __exit закрыть дескриптор файла?
Я предполагаю, что сбой вызван функцией close()
, которая косвенно вызывает обратный вызов release
в операциях с символьным файлом, причем эта функция release
больше не существует, поскольку модуль был удален.
Источник модуля ядра можно найти здесь (поиск Листинг 2 ).