Открыть символьное устройство без создания узла устройства

Открыть символьное устройство без создания узла устройства

У меня возникла проблема, когда стороннее приложение открывает узел устройства, который ему не положено открывать.

Я написал драйвер устройства SPI Slave, который выполняет некоторую обработку сообщений. Когда драйвер загружается, он находится в «режиме инициализации», который отвечает только на определенное сообщение. Чтобы повторно инициализировать связь, я должен выгрузить и перезагрузить драйвер. Проблема в том, что в системе есть стороннее приложение, работающее от имени root, которое открывает все символьные устройства. Единственный способ заставить все это работать — остановить приложение и выгрузить его, что вызывает огромную проблему для всего проекта.

Возможно ли открыть соединение с символьным устройством, не имея фактического узла устройства? Прямо сейчас я использую fopen('/dev/spi'), и все работает отлично, пока мне не нужно перезагрузиться и не возникает указанная выше проблема. Есть ли какой-либо системный вызов, который может быть сделан, чтобы привести к файловому дескриптору для определенного номера узла Major/Minor, не имея фактического файла /dev/spi?

решение1

Если приложение-нарушитель открывает только узлы устройств в /devдеревезатем вы можете разместить свой узел устройства в другом месте, если это работает с вашей собственной программой.

Файловая система, в которой находится узел устройства, должна иметь devустановленную опцию монтирования, чтобы иметь возможность специальной обработки файлов узла устройства как таковых.

(Отказ от ответственности: я не проверял это, но я делал нечто подобное раньше...)

Одним из примеров может быть монтирование небольшой tmpfsфайловой системы, например, /my-dev/и создание там узла устройства.

mkdir -p /my-dev

mount -t tmpfs -o dev,size=<size> tmpfs /my-dev

mknod /my-dev/spi <type> <maj> <min>

где<size>размер tmpfs,<type>тип узла устройства и<maj> <min>— это основные и второстепенные номера устройств; см. man-страницы для mountи mknodсоответственно.

...А затем используйте fopen("/my-dev/spi")в своей программе.

(И, конечно, убедитесь, что это udevили что-то подобноенет(Создайте узел для устройства.)

Связанный контент