Wie errno im Linux-Gerätetreiber einstellen?

9

Ich entwerfe einen Linux-Zeichengerätetreiber. Ich möchte Errno setzen, wenn Fehler in ioctl () Systemaufruf auftritt.

%Vor%

Was soll ich tun, um das zu erreichen? Vielen Dank im Voraus!

Bitte erlauben Sie mir, meine Bewerbung detaillierter zu erklären.

Mein Gerät befindet sich in / dev / myCharDev. Meine Benutzerraumanwendung ist wie folgt:

%Vor%

Wie ich in den obigen Kommentaren erwähnt habe, wie soll ich die " errno " in meinen eigenen Gerätetreibercodes einstellen und sie für die Benutzerbereichsanwendung lesbar machen?

    
Andrew Chang 04.07.2014, 05:58
quelle

3 Antworten

10

Nette Frage!

Ok, man könnte sich Errno als globale Variable vorstellen (um ehrlich zu sein, es ist ein externer Int). errno hat viele vordefinierte Makros für Fehlercodes in der Bibliothek errno.h. Sie können hier nachsehen. Es ist sehr wahrscheinlich, dass einige dieser Fehlercodes beschreiben, was Sie zeigen möchten. Nimm die richtige auf, setze sie so, als wäre es eine von dir definierte Variable und (wichtig!) Verlasse sie sofort!

Sie können sich jedoch fragen, ob die Einstellung von Fehlern die richtige Herangehensweise an Ihr Problem ist. Sie können immer ein (* int) definieren und eigene Fehlercodes und Fehlerbehandlungsmechanismen entwickeln. Errno dient dazu, Systemfehler zu zeigen und zu erklären. Betrachten Sie Ihren Code als Teil des "Systems" (wie ich sehe, entwickeln Sie Ihren eigenen Systemanruf, so könnte dies der Fall sein)? Also mach weiter und benutze errno um deinen "Systemfehler" zu erklären.

Bearbeiten (Bei Frage Update): Ok mehr Info. Wie gesagt, errno ist ein externes int und wird vom Kernel gesetzt. Der Wert, bei dem errno gesetzt ist, ist einfach der Rückgabewert des Systemaufrufs. Der Linux-Kernel interpretiert diesen negativen Wert dann über die Bibliothek errno.h. Daher wird eine Beispielfehlermeldung einfach dadurch gesetzt, dass (die EBUSY ist nur ein Beispiel - Sie können alle vordefinierten Fehlertypen verwenden) die Fehlermeldung zurückgegeben wird, die Sie von Ihrem Systemaufruf erhalten möchten. Beispiel:

%Vor%

Hoffe es hilft

    
sestus 04.07.2014, 06:09
quelle
6

Geben Sie die negative Fehlernummer vom ioctl zurück. Die c-Bibliothek interpretiert dies und gibt einen Rückgabecode von -1 zurück und setzt errno auf den positiven Fehler. Zum Beispiel wird das ursprüngliche Beispiel errno auf 1 setzen.

Nebenbei sieht Ihr Prototyp für eine ioctl-Funktion im Kernel falsch aus. Welche Kernel-Version verwendest du?

    
slobobaby 04.07.2014 07:23
quelle
0
%Vor%

Dabei ist errno der Rückgabewert einer Funktion.

Ihr Gerätetreiber sollte immer einen Status für eine Anfrage zurückgeben, die er erhalten hat.         Es wird empfohlen, dass Sie immer nummerierte Rückgabecodes sowie normale Rückgabewerte verwenden         Codes. Die Rückgabe von 0 = 1 oder -1 = fehlgeschlagen ist vage und könnte irreführend sein.

Lesen Sie den Abschnitt 3.1 Effiziente Fehlerbehandlung, Berichterstellung und Wiederherstellung: für weitere Informationen

    
Sagar Jain 04.07.2014 06:09
quelle