write(2) System Calls Manual write(2) BEZEICHNUNG write - in einen Dateideskriptor schreiben BIBLIOTHEK Standard-C-Bibliothek (libc, -lc) UBERSICHT #include ssize_t write(int dd, const void Puffer[.Anzahl], size_t Anzahl); BESCHREIBUNG write() versucht Anzahl Byte aus dem Puffer, der bei Puffer beginnt, in die Datei zu schreiben, auf die der Dateideskriptor dd weist. Die Anzahl der geschriebenen Bytes kann geringer als Anzahl sein, wenn es beispielsweise nicht genugend Platz auf dem zugrunde liegenden physischen Medium gibt oder die RLIMIT_FSIZE-Ressourcenbeschrankung erreicht wird (siehe setrlimit(2)) oder der Aufruf von einem Signal Handler nach weniger als Anzahl geschriebenen Bytes unterbrochen wurde. (Siehe auch pipe(7)) Fur 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 tatsachlich geschriebenen Bytes erhoht. Wenn die Datei mit open(2) und der Option O_APPEND geoffnet 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 durchgefuhrt. POSIX fordert, dass ein nachweisbar nach der Ruckkehr 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 hangt das Ergebnis von der Implementierung ab, falls Anzahl grosser als SSIZE_MAX ist; siehe ANMERKUNGEN fur die Obergrenze unter Linux. RUCKGABEWERT Bei Erfolg wird die Anzahl der geschriebenen Bytes zuruckgegeben. Bei einem Fehler wird -1 zuruckgegeben und errno gesetzt, um den Fehler anzuzeigen. Beachten Sie, dass ein erfolgreicher write() weniger als Anzahl Bytes ubertragen konnte. Solche Teilschreibaktionen konnen aus verschiedenen Grunden 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 ahnliches durch einen Signal-Handler unterbrochen, nachdem es einige, aber bevor es alle angeforderten Bytes ubertragen hatte. Im Falle einer Teilschreibaktion kann der Aufrufende einen weiteren write()-Aufruf durchfuhren, um samtliche verbliebene Bytes zu ubertragen. Der nachfolgende Aufruf wird entweder weitere Bytes ubertragen oder zu einem Fehler fuhren (z.B. falls die Platte jetzt voll ist). Wenn Anzahl gleich Null ist und dd auf eine normale Datei verweist, kann write() einen Fehlerstatus zuruckgeben, falls einer der nachfolgenden Fehler erkannt wird. Wenn keine Fehler festgestellt werden oder keine Fehlererkennung durchgefuhrt wird, wird 0 zuruckgegeben, ohne dass Nebenwirkungen eintreten. Wenn Anzahl gleich Null ist und dd sich nicht auf eine normale Datei bezieht, sind die Ergebnisse nicht festgelegt. FEHLER EAGAIN Der Dateideskriptor dd verweist auf eine Datei, die kein Socket und als nicht blockierend (O_NONBLOCK) gekennzeichnet ist - die Schreibaktionen wurde daher blockieren. Siehe open(2) fur weitere Details uber den Schalter O_NONBLOCK. EAGAIN oder EWOULDBLOCK Der Dateideskriptor dd verweist auf einen Socket und wurde als nicht blockierend (O_NONBLOCK) gekennzeichnet - die Schreibaktion wurde daher blockieren. POSIX.1-2001 lasst fur diesen Fall beide Fehlerstati zu und fordert nicht, dass beide Konstanten den gleichen Wert haben. Eine portable Anwendung sollte daher beide Moglichkeiten prufen. EBADF dd ist kein gultiger Dateideskriptor oder ist nicht zum Schreiben geoffnet. EDESTADDRREQ dd verweist auf einen Datagram Socket, fur den nicht mit connect(2) eine Peer-Adresse gesetzt wurde. EDQUOT Das Benutzerkontingent an Plattenblocken auf dem die Datei enthaltenden Dateisystem, auf welches sich dd bezieht, ist ausgeschopft. EFAULT Puffer liegt ausserhalb Ihres adressierbaren Adressraums. EFBIG Es wurde versucht, in eine Datei zu schreiben, die die implementations- oder prozessspezifische maximale Dateigrosse uberschreitet oder der maximal zulassige Offset wurde uberschritten. EINTR Der Aufruf wurde durch ein Signal unterbrochen, bevor irgendwelche Daten geschrieben wurden (siehe signal(7)). EINVAL dd wurde einem nicht beschreibbaren Objekt zugeordnet oder die Datei wurde mit dem Schalter O_DIRECT geoffnet und entweder die in Puffer angegebene Adresse, der in Anzahl angegebene Wert oder der Datei-Offset ist nicht geeignet ausgerichtet. EIO Ein system-/hardwarenaher E/A-Fehler trat beim Verandern der Inode auf. Dieser Fehler kann sich auf das Zuruckschreiben von Daten, die durch ein fruheres write() geschrieben wurden, beziehen, welcher sich auf einen anderen Dateideskriptor auf der gleichen Datei bezog. Seit Linux 4.13 kommen Fehler beim Zuruckschreiben mit dem Versprechen, dass sie von einer nachfolgenden write()-Anfrage berichtet werden konnen, und dass sie von einem nachfolgenden fsync(2) berichtet werden (unabhangig davon, ob sie von einem write() berichtet wurden). Eine andere mogliche 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) fur weitere Details. ENOSPC Das Gerat, welches die Datei enthalt, auf die sich dd bezieht, hat keinen Platz fur die Daten. EPERM Die Aktion wurde durch eine Dateiversiegelung verhindert; siehe fcntl(2). EPIPE dd ist mit einer Pipe oder einem Socket verbunden, dessen lesendes Ende geschlossen ist. In diesem Fall empfangt der schreibende Prozess auch ein SIGPIPE-Signal. (Somit wird der Ruckgabewert von write() nur sichtbar/wirksam/gesehen, wenn das Programm das Signal abfangt, blockiert oder ignoriert.) Abhangig von dem mit dd verbundenen Objekt konnen andere Fehler auftreten. STANDARDS POSIX.1-2008. GESCHICHTE SVr4, 4.3BSD, POSIX.1-2001. Unter SVr4 kann ein Schreiben jederzeit unterbrochen werden und EINTR zuruckgeben, nicht nur vor dem Schreiben von Daten. ANMERKUNGEN Eine erfolgreiche Ruckkehr aus write() garantiert nicht, dass Daten an die Festplatte ubergeben wurden. Auf einigen Dateisystemen, darunter NFS, garantiert es nicht einmal, dass der Speicher fur die Daten erfolgreich reserviert wurde. In diesem Fall konnen einige Fehler bis zu einem spateren write(2), fsync(2) oder sogar close(2) verzogert 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 zuruck und der Ruckgabewert ist die Anzahl der geschriebenen Bytes. Unter Linux wird write() (und ahnliche Systemaufrufe) hochstens 0x7ffff000 (2.147.479.552) Byte ubertragen und die Anzahl der tatsachlich ubertragenen Bytes zuruckliefern. Dies trifft sowohl auf 32- als auch auf 64-Bit-Systemen zu. Wird bei der Durchfuhrung eines write() wahrend direkter E/A ein Fehler zuruckgeliefert, bedeutet dies nicht, dass die gesamte Schreibaktion fehlschlug. Teildaten konnen 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 mussen im Hinblick aufeinander atomar bezuglich der in POSIX.1-2008 angegebenen Effekte sein, wenn sie auf regularen Dateien oder symbolischen Links arbeiten: Unter den im Folgenden aufgefuhrten APIs sind write() und writev(2). Und unter den Effekten, die uber 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)) durchfuhrten, waren die E/A-Aktionen im Hinblick auf die Aktualisierung des Dateiversatzes nicht atomar. Das Ergebnis war, dass die ausgegebenen Datenblocken in den zwei Prozessen sich (inkorrekterweise) uberlappten. 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) UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Martin Eberhard Schauer , Mario Blattermann und Helge Kreutzmann erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.06 31. Oktober 2023 write(2)