Ein Systemaufruf wäre meistens nicht sehr nützlich, wenn er nicht irgendeinen Wert zurückgibt: Beispielsweise den Dateideskriptor einer geöffneten Datei, die Anzahl an Bytes die in einen Puffer gelesen wurde, die Systemzeit, etc.
Außerdem muss Sie das System informieren, falls ein Fehler auftritt: Wenn eine Datei nicht existiert, die Systemressourcen erschöpft sind, wir ein ungültiges Argument übergeben haben, etc.
Der herkömmliche Ort, um nach Informationen über verschiedene Systemaufrufe unter UNIX®-Systemen zu suchen, sind die Manualpages. FreeBSD beschreibt seine Systemaufrufe in Abschnitt 2, manchmal auch Abschnitt 3.
In open(2) steht beispielsweise:
Falls erfolgreich, gibt
open()
einen nicht negativen Integerwert, als Dateideskriptor bezeichnet, zurück. Es gibt-1
im Fehlerfall zurück und setzterrno
um den Fehler anzuzeigen.
Ein Assembler-Programmierer, der neu bei UNIX® und
FreeBSD ist, wird sich sofort fragen: Wo finde ich
errno
und wie erreiche ich es?
Die Information der Manualpage bezieht sich auf C-Programme. Der Assembler-Programmierer benötigt zusätzliche Informationen.
Leider gilt: Es kommt darauf an... Für die meisten
Systemaufrufe liegt er in EAX
, aber nicht für alle. Eine
gute Daumenregel, wenn man zum ersten Mal mit einem
Systemaufruf arbeitet, ist in EAX
nach dem Rückgabewert zu
suchen. Wenn er nicht dort ist, sind weitere Untersuchungen
nötig.
Mir ist ein Systemaufruf bekannt, der den
Rückgabewert in EDX
ablegt: SYS_fork
Alle
anderen mit denen ich bisher gearbeitet habe verwenden
EAX
. Allerdings habe ich
noch nicht mit allen gearbeitet.
Wenn Sie die Antwort weder hier, noch irgendwo anders finden, studieren Sie den Quelltext von libc und sehen sich an, wie es mit dem Kernel zusammenarbeitet.
Tatsächlich, nirgendwo...
errno
ist ein Teil der Sprache C, nicht
des UNIX®-Kernels. Wenn man direkt auf Kernel-Dienste
zugreift, wird der Fehlercode in EAX
zurückgegeben, das selbe
Register in dem der Rückgabewert, bei einem erfolgreichen
Aufruf landet.
Das macht auch Sinn. Wenn kein Fehler auftritt, gibt es keinen Fehlercode. Wenn ein Fehler auftritt, gibt es keinen Rückgabewert. Ein einziges Register kann also beides enthalten.
Wenn Sie die Standard FreeBSD-Aufrufkonvention verwenden
wird das carry flag
gelöscht wenn der Aufruf erfolgreich ist und gesetzt wenn
ein Fehler auftritt.
Wenn Sie den Linux-Emulationsmodus verwenden ist der
vorzeichenbehaftete Wert in EAX
nicht negativ, bei einem
erfolgreichen Aufruf. Wenn ein Fehler auftritt ist der Wert
negativ, also -errno
.
Wenn Sie Fragen zu FreeBSD haben, schicken Sie eine E-Mail an
<de-bsd-questions@de.FreeBSD.org>.
Wenn Sie Fragen zu dieser Dokumentation haben, schicken Sie eine E-Mail an
<de-bsd-translators@de.FreeBSD.org>.