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-1im Fehlerfall zurück und setzterrnoum 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
EDXablegt:SYS_forkAlle 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
<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>.