Ich habe ein Problem, bei dem eine Drittanbieteranwendung einen Geräteknoten öffnet, den sie nicht öffnen sollte.
Ich habe einen SPI-Slave-Gerätetreiber geschrieben, der einige Nachrichten verarbeitet. Wenn der Treiber geladen wird, befindet er sich im „Initialisierungsmodus“, der nur auf eine bestimmte Nachricht antwortet. Um die Kommunikation neu zu initialisieren, muss ich den Treiber entladen und neu laden. Das Problem besteht darin, dass das System eine Drittanbieteranwendung hat, die als Root ausgeführt wird und alle Zeichengeräte öffnet. Die einzige Möglichkeit, dies alles zum Laufen zu bringen, besteht darin, die Anwendung zu stoppen und zu entladen, was ein großes Problem mit dem gesamten Projekt verursacht.
Ist es möglich, eine Verbindung zu einem Zeichengerät herzustellen, ohne tatsächlich einen Geräteknoten zu haben? Momentan verwende ich fopen('/dev/spi') und alles funktioniert einwandfrei, bis ich neu laden muss und das obige Problem auftritt. Gibt es irgendeine Art von Systemaufruf, der zu einem Dateideskriptor für eine bestimmte Major/Minor-Knotennummer führen würde, ohne die eigentliche /dev/spi-Datei zu haben?
Antwort1
Wenn die störende Anwendung nur Geräteknoten im /dev
Baum öffnetdann könntest Du Deinen Geräteknoten auch woanders platzieren, wenn das mit Deinem eigenen Programm funktioniert.
Für das Dateisystem, auf dem sich der Geräteknoten befindet, muss die Mount-Option dev
festgelegt sein, damit Geräteknotendateien als solche speziell behandelt werden.
(Haftungsausschluss: Ich habe dies nicht getestet, aber ich habe schon ähnliche Dinge gemacht …)
Ein Beispiel wäre, tmpfs
beispielsweise ein kleines Dateisystem einzubinden /my-dev/
und dort den Geräteknoten zu erstellen.
mkdir -p /my-dev
mount -t tmpfs -o dev,size=<size> tmpfs /my-dev
mknod /my-dev/spi <type> <maj> <min>
Wo<size>
ist die Größe des tmpfs,<type>
ist der Geräteknotentyp und<maj> <min>
sind die Haupt-:Nebengerätenummern; siehe die Manpages für mount
bzw. mknod
.
...Und dann fopen("/my-dev/spi")
in Ihrem Programm verwenden.
(Und natürlich sicherstellen, dass udev
oder ähnlichesnichtErstellen Sie einen Knoten für das Gerät.)