ioctl() - Was tut dieser Systemcall und warum könnte er fehlschlagen?

4 Antworten

ioctl - input output control. Ist ein Syscall, der Parameter auf entsprechenden Geräten setzen kann, analog gibt es z.B. fcntl für Dateien. (Vorbedingung für ioctls ist ein filehandle der Gerätedatei)

Interessant wäre es, wenn Du wüßtest welcher IOCTL auf welchem Gerät ausgeführt werden soll und wieso er inappropriate ist. Letzteres kann Dir dann die Doku sagen.

Insofern wäre also die erste wichtige Info, welcher IOCTL eigentlich ausgeführt werden soll, daraus dürfte sich alles weitere ergeben.

Hättest Du nicht den Quellcode, dann wäre strace Dein Freund.

Ferner gibt es für ioctls oft auch man pages:

man ioctl_tty 

Dokumentiert beispielsweise die IOCTLs für ttys/terminals.


Tanrim734 
Fragesteller
 22.03.2023, 15:28

H!

"Interessant wäre es, wenn Du wüßtest welcher IOCTL auf welchem Gerät ausgeführt werden soll..."

Es gibt nicht zufällig eine Möglichkeit sich das anzeigen zu lassen?
In meinem Quellcode sehe ich nur den Funktionsaufruf mit den drei Parametern, die übergeben werden.

Vielen Dank im Voraus.

Beste Grüße

Tanrim734

0
KarlRanseierIII  22.03.2023, 17:13
@Tanrim734

Typischerweise sind symbolische Namen Teil dieser Parameter, andernfalls wiederhole ich gerne nochmal: strace.

strace mappt Dir auch numerische Parameter auf die symbolischen Konstanten, das sieht dann zum Beispiel so aus:

ioctl(0, TCGETS, {c_iflag=ICRNL|IXON|IUTF8, c_oflag=NL0|CR0|TAB0|BS0|VT0|FF0|OPOST|ONLCR, c_cflag=B38400|CS8|CREAD, c_lflag=ISIG|ICANON|ECHO|ECHOE|ECHOK|IEXTEN|ECHOCTL|ECHOKE, ...}) = 0

Hier werden die Attribute eines Terminalgerätes geholt. Die Rückgabe nach dem Gleichheitszeichen (hier 0) zeigt, daß der Aufruf erfolgreich war.

strace kennt Unmengen an Optionen, sodaß Du z.B. auf bestimmte Aufrufe filtern kannst.

Jetzt kann es natürlich sein, daß der ioctl() selbst nicht im Quellcode auftaucht, weil eigentlich eine Bibliotheksfunktion genutzt wird, die den ioctl zur Folge hat - Da kann Dir dann ltrace behilflich sein.

0

Die Funktion ioctl() ist eine Systemaufruf-Funktion, die erlaubt es Einstellungen und Funktionen von Geräten und Dateien zu kontrollieren. Mit Ihr kann man Gerätetreiber oder bestimmte Gerätefunktionen ansprechen, die nicht auf anderer Weise ansprechbar sind.

Wahrscheinlich spricht ioctl() auf eine Gerätedatei, wo aber der Gerätetreiber des Gerätes nicht diese spezifische Operation unterstützt. Normalerweise passiert das wenn eine bestimmte Gerätefunktion nur auf bestimmten Geräten unterstützt wird und der Treiber des Gerätes dies nicht unterstützt. Da gibt dann das Betriebssystem den Fehler 25 zurück, um zu sagen, dass die ioctl-Operation nicht auf dem Gerät ausgeführt werden kann.

Also so wie ich das sehe, müsste dein Gerät damit einwandfrei kompatibel sein. Auch das Betriebssystem sollte nicht das Problem sein.

Ich würde dir mal empfehlen, zu überprüfen, ob spezielle Treiber verfügbar sind oder ob bestimmte ioctl-Operationen vom aktuellen Treiber unterstützt werden.


Tanrim734 
Fragesteller
 16.03.2023, 13:09

@TheDoessler623

Vielen Dank. Das gibt schon ein etwas klareres Bild ab.
Die zusätzlichen Treiber die ich verwende sind hier.

Für deinen Punkt mit "spezielle Treiber" und "bestimmte ioctl-Operationen" muss ich erst nachsehen. Das wird etwas dauern.

Auf jeden Fall vielen Dank bis hierhin.

Beste Grüße

Tanrim734

1
TheDoessler623  16.03.2023, 13:46
@Tanrim734

Ok bedenke, es gibt viele verschiedene Arten von ioctl-Aufrufen, und ob ein bestimmter ioctl-Aufruf mit einem bestimmten Treiber funktioniert, hängt davon ab, welche Funktionen der Treiber implementiert hat und welche Parameter vom ioctl-Aufruf übergeben werden. Damit ist der Code und die verwendeten Funktionen auch sehr entscheidend.

0

Wenn du auf deiner Ubuntu-Kommandozeile "man ioctl" eingibst, siehst du, dass ioctl() diverse Parameter für verschiedene Gerätetreiber einstellen kann. Z.B. die Eigenschaften eines Terminals.

Deine Fehlermeldung

[Errno 25] Inappropriate ioctl for device.

würde ich so interpretieren, dass ein ioctl()-Kommando an einen Gerätetreiber geschickt wurde, welches für diesen aber unpassend ist bzw. dieser nicht versteht.


Tanrim734 
Fragesteller
 16.03.2023, 12:53

Besten Dank. Jetzt hab ich schon eine Richtung in der ich weitersuchen kann. Das mit der man-Page war auch mein erster Gedanke. Ich sehe die Beschreibung dort, die möglichen Fehler- und Rückgabewerte. Allerdings krieg ich leider keinen Bogen gespannt zu meinem konkreten Anwendungsfall.

0

irgendwas kann nicht über serielle schnittstelle angesprochen werden.


Tanrim734 
Fragesteller
 16.03.2023, 12:50

Besten Dank.

0