Provided by: manpages-de-dev_2.16-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 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>.