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 ienen 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?
Anmerkung: 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.
Anmerkung: Mir ist ein Systemaufruf bekannt, der den Rückgabewert in
EDX
ablegt:SYS_fork
Alle anderen mit denen ich bisher gearbeitet habe verwendenEAX
. Alelrdings habe ich noch nicht mit allen gearbeitet.
Tipp: Wenn Sie die Antwort weder hier, noch irgendwo anders finden, studieren Sie den Qualltext von libc und sehen sich an, wie es mit dem Kernel zusammenarbeitet.
errno
?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
.
Zurück | Zum Anfang | Weiter |
Systemaufrufe | Nach oben | Portablen Code erzeugen |
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>.