write(2) in einen Dateideskriptor schreiben

ÜBERSICHT

#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count);

BESCHREIBUNG

write() versucht count Byte aus dem Puffer, auf den buf zeigt, in die Datei zu schreiben, auf die der Dateideskriptor fd weist.

Die Anzahl der geschriebenen Bytes kann geringer als count sein, wenn es beispielsweise nicht genügend Platz auf dem zugrunde liegenden physischen Medium gibt oder die RLIMIT_FSIZE-Ressourcenbeschränkung erreicht wird (siehe setrlimit(2)) oder der Aufruf von einem Signal Handler nach weniger als count geschriebenen Bytes unterbrochen wurde. (siehe auch pipe(7))

Für eine Datei, auf die lseek(2) angewendet werden kann, (z. B. eine normale Datei) erfolgt das Schreiben am Datei-Offset. Dabei wird der Datei-Offset um die Anzahl der tatsächlich geschriebenen Bytes erhöht. Wenn die Datei mit open(2) und der Option O_APPEND geöffnet wurde, wird der Datei-Offset vor dem ersten Schreiben auf das Dateiende gesetzt. Die Einstellung des Datei-Offsets und die Schreiboperation werden als eine unteilbare (atomare) Operation durchgeführt.

POSIX fordert, dass ein nachweisbar nach der Rückkehr von write() liegendes read(2) die neuen Daten liefern muss. Es sollte jedoch beachtet werden, dass nicht alle Dateisysteme zu POSIX konform sind.

RÜCKGABEWERT

Bei Erfolg wird die Anzahl der tatsächlich geschriebenen Bytes zurückgegeben (Null bedeutet, dass nichts geschrieben wurde). Es ist kein Fehler, falls diese Zahl kleiner als die Anzahl der angeforderten Bytes ist. Dies kann beispielsweise passieren, falls die Platte gefüllt war. Siehe auch HINWEISE.

Bei einem Fehler wird -1 zurückgegeben und errno entsprechend gesetzt.

Wenn count gleich Null ist und fd auf eine normale Datei verweist, kann write() einen Fehlerstatus zurückgeben, falls einer der nachfolgenden Fehler erkannt wird. Wenn keine Fehler festgestellt werden oder keine Fehlererkennung durchgeführt wird, wird 0 zurückgegeben, ohne dass Nebenwirkungen eintreten. Wenn count gleich Null ist und fd sich nicht auf eine normale Datei bezieht, sind die Ergebnisse nicht festgelegt.

FEHLER

EAGAIN
Der Dateideskriptor fd verweist auf eine Datei, die kein Socket und als nicht blockierend (O_NONBLOCK) gekennzeichnet ist - die Schreiboperation würde daher blockieren. Siehe open(2) für weitere Details über den Schalter O_NONBLOCK.
EAGAIN oder EWOULDBLOCK
Der Dateideskriptor fd verweist auf einen Socket und wurde als nicht blockierend (O_NONBLOCK) gekennzeichnet - die Schreiboperation würde daher blockieren. POSIX.1-2001 lässt für diesen Fall beide Fehlerstati zu und fordert nicht, dass beide Konstanten den gleichen Wert haben. Eine portable Anwendung sollte daher beide Möglichkeiten prüfen.
EBADF
fd ist kein gültiger Dateideskriptor oder ist nicht zum Schreiben geöffnet.
EDESTADDRREQ
fd verweist auf einen Datagram Socket, für den nicht mit connect(2) eine Peer-Adresse gesetzt wurde.
EDQUOT
Das Benutzerkontingent an Disk-Blöcken auf dem die Datei enthaltenden Dateisystem, auf welches sich fd bezieht, ist ausgeschöpft.
EFAULT
buf liegt außerhalb Ihres adressierbaren Adressraums.
EFBIG
Es wurde versucht, in eine Datei zu schreiben, die die implementations- oder prozessspezifische maximale Dateigröße überschreitet oder der maximal zulässige Offset wurde überschritten.
EINTR
Der Aufruf wurde durch ein Signal unterbrochen, bevor irgendwelche Daten geschrieben wurden (siehe signal(7)).
EINVAL
fd wurde einem nicht beschreibbaren Objekt zugeordnet oder die Datei wurde mit dem Schalter O_DIRECT geöffnet und entweder die in buf angegebene Adresse, der in count angegebene Wert oder der Datei-Offset ist nicht geeignet ausgerichtet.
EIO
Bei der Bearbeitung des Inodes trat ein system-/hardwarenaher E/A-Fehler (engl. I/O) auf.
ENOSPC
Das Gerät, welches die Datei enthält, hat keinen Platz für die Daten.
EPERM
The operation was prevented by a file seal; see fcntl(2).
EPIPE
fd ist mit einer Pipe oder einem Socket verbunden, dessen lesendes Ende geschlossen ist. In diesem Fall empfängt der schreibende Prozess auch ein SIGPIPE-Signal. (Somit wird der Rückgabewert von write() nur sichtbar/wirksam/gesehen, wenn das Programm das Signal abfängt, blockiert oder ignoriert.)

Abhängig von dem mit fd verbundenen Objekt können weitere Fehler auftreten.

KONFORM ZU

SVr4, 4.3BSD, POSIX.1-2001.

Unter SVr4 kann ein Schreiben jederzeit unterbrochen werden und EINTR zurückgeben, nicht nur vor dem Schreiben von Daten.

ANMERKUNGEN

The types size_t and ssize_t are, respectively, unsigned and signed integer data types specified by POSIX.1.

Eine erfolgreiche Rückkehr aus write() garantiert nicht, dass Daten an die Festplatte übergeben wurden. In der Tat garantiert es auf einigen fehlerhaften Implementierungen nicht einmal, dass der Speicher für die Daten erfolgreich reserviert wurde. Der einzig sichere Weg ist der Aufruf von fsync(2), nachdem Sie alle Ihre Daten geschrieben haben.

Wenn ein write() von einem Signal-Handler unterbrochen wird, bevor irgendwelche Bytes geschrieben wurden, wird der Auruf mit dem Fehler EINTR enden. Wird das write() unterbrochen, nachdem mindestens ein Byte geschrieben wurde, kehrt die Funktion erfolgreich zurück und der Rückgabewert ist die Anzahl der geschriebenen Bytes.

Unter Linux wird write() (und ähnliche Systemaufrufe) höchstens 0x7ffff000 (2.147.479.552) Byte übertragen und die Anzahl der tatsächlich übertragenen Bytes zurückliefern. Dies trifft sowohl auf 32- als auch auf 64-Bit-Systemen zu.

FEHLER

Laut POSIX.1-2008/SUSv4 Abschnitt XSI 2.9.7 (»Thread Interactions with Regular File Operations«):

Alle der folgenden Funktionen sollen im Hinblick aufeinander atomar bezüglich der in POSIX.1-2008 angegebenen Effekte sein, wenn sie auf regulären Dateien oder symbolischen Links arbeiten: …

Among the APIs subsequently listed are write() and writev(2). And among the effects that should be atomic across threads (and processes) are updates of the file offset. However, on Linux before version 3.14, this was not the case: if two processes that share an open file description (see open(2)) perform a write() (or writev(2)) at the same time, then the I/O operations were not atomic with respect updating the file offset, with the result that the blocks of data output by the two processes might (incorrectly) overlap. This problem was fixed in Linux 3.14.

KOLOPHON

Diese Seite ist Teil der Veröffentlichung 4.06 des Projekts Linux-man-pages. Eine Beschreibung des Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden sich unter https://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

Die deutsche Übersetzung dieser Handbuchseite wurde von Martin Eberhard Schauer <[email protected]>, Mario Blättermann <[email protected]> und Helge Kreutzmann <[email protected]> erstellt.

Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.

Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an <[email protected]>.