Mein Verständnis ist, dass es mit dem Verhalten von Systemaufrufen verbunden war.
Betrachten Sie den Systemaufruf open()
; Wenn es erfolgreich ist, gibt es eine nicht negative Ganzzahl zurück, bei der es sich um den erstellten Dateideskriptor handelt. Auf der Assembler-Ebene (wo es eine spezielle Nicht-C-Anweisung gibt, die in den Kernel einfängt) wird jedoch bei der Rückgabe eines Fehlers ein negativer Wert zurückgegeben. Wenn es eine Fehlerrückgabe erkennt, speichert der C-Code-Wrapper um den Systemaufruf den negierten Wert in errno
(so hat errno
einen positiven Wert) und die Funktion gibt -1 zurück.
Bei einigen anderen Systemaufrufen wird der negative Rückgabecode auf der Assembler-Ebene noch negiert und in errno
platziert und -1 zurückgegeben. Diese Systemaufrufe haben jedoch keinen besonderen Rückgabewert, daher wurde Null zum Anzeigen des Erfolgs gewählt. Natürlich gibt es eine große Vielfalt von Systemaufrufen, aber die meisten schaffen es, diese Konventionen zu erfüllen. Zum Beispiel geben stat()
und ihre Verwandten eine Struktur zurück, aber ein Zeiger auf diese Struktur wird als ein Eingabeparameter übergeben, und der Rückgabewert ist ein 0 oder -1 Status. Sogar signal()
schafft es; -1 war SIG_DFL und 0 war SIG_IGN, und andere Werte waren Funktionszeiger. Es gibt einige Systemaufrufe ohne Fehlerrückgabe - getpid()
, getuid()
und so weiter.
Dieser Null-gibt-Erfolg-Mechanismus wurde dann von anderen Funktionen emuliert, die eigentlich keine Systemaufrufe waren.
Irgendwie denke ich, das sollte in das Wiki gehen, ich liebe all diese verschiedenen Gründe, die Leute finden (und ich denke, viele von ihnen sind gültig) – kritzikratzi
Ja, wahrscheinlich gibt es keine einzige richtige Antwort. Ich denke, sie sind alle plausibel und sicherlich für sich allein gültig. Ich habe sicherlich nicht das Wissen, der Richter zu sein. –