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?
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
. Allerdings habe ich noch nicht mit allen gearbeitet.
Tipp: 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.
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
<[email protected]>.
Wenn Sie Fragen zu dieser Dokumentation haben, schicken Sie eine E-Mail an <[email protected]>.