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