2016-06-18 4 views

Antwort

3

Der Linux-Kernel verwendet ein paar verschiedene Methoden für die Fehlerbedingungen zu tun. Im Gegensatz zu C-Userspace-Programmen speichern Funktionen ihren Fehlercode nicht in einer globalen Variablen, sondern geben den Wert direkt zurück. Sie sehen in der Regel, dass dies wie folgt durchgeführt wird:

  • Funktionen, die keinen Wert abgesehen von einem Fehlercode zurück typischerweise zurückkehren 0 auf Erfolg und -ESOMETHING bei Ausfall.
  • Funktionen, die einen nichtnegativen numerischen Wert zurückgeben können (z. B. ein Index, eine Dateibeschreibung oder eine Länge in Byte) sind ähnlich: 0 oder höher gibt Erfolg an und negative Werte zeigen Fehler an.
  • Funktionen, die Zeiger zurückgeben, können einen Wert in einem speziellen Bereich zurückgeben, um auf einen Fehler hinzuweisen. Wenn Sie den Rückgabewert IS_ERR() aufrufen, können Sie prüfen, ob ein Fehler aufgetreten ist. Mit PTR_ERR() können Sie den Fehlercode extrahieren, der wiederum negiert wird.

Leider verwendet die kmalloc() Funktion keinen dieser Stile. Bei einem Fehler wird NULL zurückgegeben, ohne Ihnen einen spezifischen Fehlercode zu geben.

+0

Danke Ed !!! – LiorGolan

+2

Ich würde hinzufügen, dass 'kmalloc()' auch 'ZERO_SIZE_PTR' zurückgeben kann, wenn die angegebene Größe 0 ist. Daher sollten Sie Ihre Größe explizit überprüfen, bevor Sie' kmalloc() 'aufrufen, um den Umgang mit' ZERO_SIZE_PTR' zu vermeiden. Denken Sie auch daran, 'PTR_ERR_OR_ZERO()' anstelle von Dingen wie 'PTR_RET()' (was jetzt veraltet ist), 'IS_ERR()' und 'PTR_ERR()' zu verwenden. –

+0

Es könnte sein, dass jemand überrascht ist, dass von malloc kein NULL-Code zurückgegeben wird, wenn die Größe 0 ist! Also, sei vorsichtig im Code. @SamProtsenko erzählte Ihnen bereits die Details. – 0andriy

1

Im Kernelbereich gibt es keine errno. Sie können nur überprüfen Sie die Rückkehr einer Kernfunktion mit einer if-Anweisung zum Beispiel für die kmalloc():

struct dog *ptr; 

ptr = kmalloc(sizeof(struct dog), GFP_KERNEL); 
if (!ptr) 
    /* handle error ... */ 

Wo Sie Ihre Fehler behandeln können Sie dann entscheiden, welche der errno-Wert im Benutzerraum wäre nur mit :

Linux Kernel interpretiert dann diesen negativen Wert durch die Bibliothek errno.h. Sie können die Liste der Fehler finden die errno Variable setzen in:

include/asm-generic/errno.h 
include/asm-generic/errno-base.h 
+0

Vielen Dank .. BTW, warum müssen wir einen negativen Wert des Fehlers zurückgeben? (Ich habe gesehen, dass jeder das auf mehreren Online-Beispielen macht) – LiorGolan

+0

@LiorGolan hängt von der Implementierung des syscall ab, der (in den meisten Fällen) den Rückgabewert vom Kernel verwendet, um den Wert von errno einzugeben. Wir könnten sagen, dass fast alle syscall das errno setzen, wenn der Rückgabewert vom Kernel negativ ist, es gibt keinen bestimmten Grund, dass es eine Konvektion ist – mik1904