Tengo un problema en el que una aplicación de terceros abre un nodo de dispositivo que no debería.
Escribí un controlador de dispositivo SPI Slave que procesa algunos mensajes. Cuando el controlador carga está en "Modo de inicialización", que solo responde a un mensaje específico. Para reiniciar las comunicaciones debo descargar y recargar el controlador. El problema es que el sistema tiene una aplicación de terceros, que se ejecuta como root, que abre todos los dispositivos de caracteres. La única forma de hacer que todo esto funcione es detener la aplicación y descargarla, lo que causa un gran problema en todo el proyecto.
¿Es posible abrir una conexión a un dispositivo de personaje sin tener realmente un nodo de dispositivo? En este momento uso fopen('/dev/spi') y todo funciona bien hasta que necesito recargar y surge el problema anterior. ¿Se puede realizar algún tipo de llamada al sistema que resulte en un descriptor de archivo para un número de nodo mayor/menor específico sin tener el archivo /dev/spi real?
Respuesta1
Si la aplicación infractora solo abre nodos de dispositivos en el /dev
árbolentonces podrías colocar el nodo de tu dispositivo en otro lugar, si eso funciona con tu propio programa.
El sistema de archivos en el que reside el nodo del dispositivo debe tener dev
configurada la opción de montaje para que tenga un tratamiento especial de los archivos del nodo del dispositivo como tales.
(Descargo de responsabilidad: no he probado esto, pero he hecho cosas similares antes...)
Un ejemplo sería montar un pequeño tmpfs
sistema de archivos, por ejemplo, /my-dev/
y crear el nodo del dispositivo allí.
mkdir -p /my-dev
mount -t tmpfs -o dev,size=<size> tmpfs /my-dev
mknod /my-dev/spi <type> <maj> <min>
dónde<size>
es el tamaño del tmpfs,<type>
es el tipo de nodo del dispositivo y<maj> <min>
son los números de dispositivos mayores:menores; consulte las páginas de manual de mount
y mknod
respectivamente.
...Y luego úselo fopen("/my-dev/spi")
en su programa.
(Y, por supuesto, asegúrese de que eso udev
o algo similar lo haganohaga un nodo para el dispositivo).