У меня возникла проблема, когда стороннее приложение открывает узел устройства, который ему не положено открывать.
Я написал драйвер устройства 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
или что-то подобноенет(Создайте узел для устройства.)