Öffnen Sie ein Zeichengerät, ohne einen Geräteknoten zu erstellen

Öffnen Sie ein Zeichengerät, ohne einen Geräteknoten zu erstellen

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 /devBaum ö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 devfestgelegt 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, tmpfsbeispielsweise 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 mountbzw. mknod.

...Und dann fopen("/my-dev/spi")in Ihrem Programm verwenden.

(Und natürlich sicherstellen, dass udevoder ähnlichesnichtErstellen Sie einen Knoten für das Gerät.)

verwandte Informationen