write

WRITE(2)                   Linux-Programmierhandbuch                  WRITE(2)



BEZEICHNUNG
       write - 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 bei buf beginnt, 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 Schreibaktion werden
       als eine unteilbare (atomare) Aktion durchgeführt.

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

       Laut POSIX.1 hängt das Ergebnis von der Implementierung ab, falls
       count gröÃer als SSIZE_MAX ist; siehe ANMERKUNGEN für die Obergrenze
       unter Linux.

RÃCKGABEWERT
       Bei Erfolg wird die Anzahl der geschriebenen Bytes zurückgegeben. Bei
       einem Fehler wird -1 zurückgegeben und errno gesetzt, um die Ursache
       des Fehlers anzuzeigen.

       Beachten Sie, dass ein erfolgreicher write() weniger als count Bytes
       übertragen könnte. Solche Teilschreibaktionen können aus
       verschiedenen Gründen auftreten. Beispielsweise gab es unzureichend
       Platz auf der Platte, um die gesamten angeforderten Bytes zu schreiben
       oder blockiertes write() wurde beim Schreiben in ein Socket, eine Pipe
       oder ähnliches durch einen Signal-Handler unterbrochen, nachdem es
       einige, aber bevor es alle angeforderten Bytes übertragen hatte. Im
       Falle einer Teilschreibaktion kann der Aufrufende einen weiteren
       write()-Aufruf durchführen, um sämtliche verbliebene Bytes zu
       übertragen. Der nachfolgende Aufruf wird entweder weitere Bytes
       übertragen oder zu einem Fehler führen (z.B. falls die Platte jetzt
       voll ist).

       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
              Schreibaktionen 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
              Schreibaktion 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    Ein system-/hardwarenaher E/A-Fehler trat beim Verändern der
              Inode auf. Dieser Fehler kann sich auf das Zurückschreiben von
              Daten, die durch ein früheres write() geschrieben wurden,
              beziehen, welcher sich auf einen anderen Dateideskriptor auf der
              gleichen Datei bezog. Seit Linux 4.13 kommen Fehler beim
              Zurückschreiben mit dem Versprechen, dass sie von einer
              nachfolgenden write()-Anfrage berichtet werden können, und dass
              sie von einem nachfolgenden fsync(2) berichtet werden
              (unabhängig davon, ob sie von einem write() berichtet wurden).
              Eine andere mögliche Ursache von EIO bei Netzwerkdateisystemen
              sind empfohlene Sperren, die aus dem Dateideskriptor
              herausgenommen wurden, und diese Sperre dann verloren gegangen
              ist. Siehe den Abschnitt Verlorene Sperren von fcntl(2) für
              weitere Details.

       ENOSPC Das Gerät, welches die Datei enthält, hat keinen Platz für
              die Daten.

       EPERM  Die Aktion wurde durch eine Dateiversiegelung verhindert; siehe
              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 andere 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
       Die Typen size_t und ssize_t sind, respektive, vorzeichenlose und
       vorzeichenbehaftete Ganzzahldatentypen, wie durch POSIX.1 spezifiziert.

       Eine erfolgreiche Rückkehr aus write() garantiert nicht, dass Daten an
       die Festplatte übergeben wurden. Auf einigen Dateisystemen, darunter
       NFS, garantiert es nicht einmal, dass der Speicher für die Daten
       erfolgreich reserviert wurde. In diesem Fall können einige Fehler bis
       zu einem späteren write(2), fsync(2) oder sogar close(2) verzögert
       werden. 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.

       Wird bei der Durchführung eines write() während direkter E/A ein
       Fehler zurückgeliefert, bedeutet dies nicht, dass die gesamte
       Schreibaktion fehlschlug. Teildaten können geschrieben worden sein und
       die Daten am Datei-Offset, an dem der write() versucht wurde, sollte
       als inkonsistent betrachtet werden.

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

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

       Unter den im Folgenden aufgeführten APIs sind write() und writev(2).
       Und unter den Effekten, die über Threads (und Prozesse) hinweg atomar
       sein sollten, ist die Aktualisierung des Dateiversatzes. Unter Linux
       vor Version 3.14 war das allerdings nicht der Fall: Falls zwei
       Prozesse, die eine offene Dateideskription gemeinsam nutzten (siehe
       open(2)) gleichzeitig einen write() (oder writev(2)) durchführten,
       waren die E/A-Aktionen im Hinblick auf die Aktualisierung des
       Dateiversatzes nicht atomar. Das Ergebnis war, dass die ausgegebenen
       Datenblöcken in den zwei Prozessen sich (inkorrekterweise)
       überlappten. Dieses Problem wurde in Linux 3.14 behoben.

SIEHE AUCH
       close(2), fcntl(2), fsync(2), ioctl(2), lseek(2), open(2), pwrite(2),
       read(2), select(2), writev(2), fwrite(3)

KOLOPHON
       Diese Seite ist Teil der Veröffentlichung 5.03 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 <Martin.E.Schauer@gmx.de>, Mario Blättermann
       <mario.blaettermann@gmail.com> und Helge Kreutzmann
       <debian@helgefjell.de> 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 <debian-l10n-
       german@lists.debian.org>.



Linux                          10. Oktober 2019                       WRITE(2)