может ли ядро ​​определить, какое пользовательское приложение было убито/закрыто среди нескольких приложений, которые оно обслуживает

Я пишу драйвер ядра Linux, который создает файл символьного устройства /dev/my_file. Несколько приложений пользовательского пространства выполняют open() этого файла и используют предоставленную команду ioctl для регистрации конкретных данных приложения. IOCTL также обеспечивает отмену регистрации cmd, которую приложения могут использовать и отменять регистрацию (ядро drv удаляет данные приложения, удаляет любое выделение памяти и т. д.) при чистом выходе. Однако, если приложение будет уничтожено после выполнения open() и ioctl, зарегистрируйте cmd. Как драйвер может определить, какое приложение было убито, а затем выполнить задачу очистки для удаления конкретных данных приложения. Я знаю, что вызывается .release func ptr из struct file_operations, и драйвер уведомляется, но не уверен, как drv может найти конкретное приложение, которое было убито.

Спасибо, Шиталь.


person Sheetal T    schedule 28.01.2021    source источник


Ответы (1)


Очистка на уровне приложения (или процесса) сложна, поскольку контекст процесса, вызывающий обработчик .release(), не обязательно совпадает с контекстом, вызывающим обработчик .open(). (Например, процесс, вызвавший open(), может разветвить дочерний процесс и выйти, оставив дочерний процесс работающим как процесс-демон.)

Вместо этого я бы рекомендовал очистку на уровне описания открытого файла. Каждый успешный вызов open() создает описание открытого файла, а обработчик .release() вызывается, когда больше нет ссылок на это описание открытого файла. Вы можете использовать элемент private_data из struct file, чтобы указать на частную структуру данных, выделенную обработчиком .open(). Эта открытая файловая структура данных может иметь элемент, который указывает на вашу частную структуру данных, специфичную для вашего устройства.

В качестве практического примера я сделал вышеописанное в коде ядра для подсистемы Comedi. Его .open() обработчик comedi_open() (см. ="nofollow noreferrer">drivers/staging/commedi/commedi_fops.c) выделяет struct comedi_file (на который будет указывать private_data элемент struct file), а struct comedi_file содержит указатель (участник dev) на личные данные устройства введите struct comedi_device. Другие элементы struct comedi_file содержат информацию, которая может различаться в зависимости от открытого файла и не используется совместно с другими open() того же файла. struct comedi_file, выделенный comedi_open(), освобождается обработчиком .release() comedi_close() (который я должен когда-нибудь переименовать в comedi_release!).

person Ian Abbott    schedule 28.01.2021