Provided by: manpages-de-dev_2.5-1_all bug

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 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 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 Fehler trat beim Verändern der Inode auf. Dieser Fehler  kann  sich  auf
              das  Zurückschreiben  von  Daten,  die  durch  ein früheres write(2) 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(2)-Anfrage berichtet werden können, und dass sie von einem nachfolgenden fsync(2)  berichtet
              werden  (unabhängig  davon,  ob  sie  von  einem  write(2) 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.

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  4.15  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>.