WRITE(2) | Podręcznik programisty Linuksa | WRITE(2) |
write - zapisuje do deskryptora pliku
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t liczba);
write() writes up to count bytes from the buffer starting at buf to the file referred to by the file descriptor fd.
Liczba bajtów zapisanych może być mniejsza niż liczba jeżeli, na przykład nie ma wystarczającej ilości wolnej przestrzeni na urządzeniu fizycznym, lub zasoby RLIMIT_FSIZE zostały wyczerpane (patrz setrlimit(2)), wywołanie zostało przerwane przez obsługę sygnału po zapisaniu mniej niż liczba bajtów (spójrz również na pipe(7)).
Dla przeszukiwalnych plików (np. takie na których można użyć lseek(2), na przykład, pliki zwykłe (regular)) zapis ma miejsce w danym przesunięciu pliku (offsecie), i to przesunięcie jest zwiększane o ilość aktualnie zapisanych danych. Jeżeli plik został otwarty (open(2)) z O_APPEND, wtedy przesunięciem (offsetem) jest koniec pliku przed zapisem. Dostosowanie przesunięcia pliku i operacja zapisu są wykonywane jako nierozdzielne (atomowe).
POSIX requires that a read(2) that can be proved to occur after a write() has returned will return the new data. Note that not all filesystems are POSIX conforming.
According to POSIX.1, if count is greater than SSIZE_MAX, the result is implementation-defined; see NOTES for the upper limit on Linux.
On success, the number of bytes written is returned. On error, -1 is returned, and errno is set to indicate the cause of the error.
Note that a successful write() may transfer fewer than count bytes. Such partial writes can occur for various reasons; for example, because there was insufficient space on the disk device to write all of the requested bytes, or because a blocked write() to a socket, pipe, or similar was interrupted by a signal handler after it had transferred some, but before it had transferred all of the requested bytes. In the event of a partial write, the caller can make another write() call to transfer the remaining bytes. The subsequent call will either transfer further bytes or may result in an error (e.g., if the disk is now full).
Jeżeli liczba jest zerem a fd wskazuje na zwykły (regular) plik, wtedy write() może zwrócić status niepowodzenia jeżeli zostanie wykryty jeden z poniższych błędów. Jeżeli nie wykryto błędów lub nie dokonano próby wykrycia błędów, 0 zostanie zwrócone bez żadnych innych skutków. Jeżeli liczba jest zerem a fd odwołuje się do pliku innego typu niż zwykły (regular), skutki nie są sprecyzowane.
Zależnie od obiektu podłączonego do fd, mogą także zajść inne (nieopisane) błędy.
SVr4, 4.3BSD, POSIX.1-2001.
Pod SVr4 EINTR jest zwracane zarówno gdy po przerwaniu wywołania, dane zostały zapisane częściowo lub przed jakimkolwiek zapisem.
Typy size_t i ssize_t to odpowiednio liczba całkowita bez i ze znakiem, zgodnie z POSIX.1.
A successful return from write() does not make any guarantee that data has been committed to disk. On some filesystems, including NFS, it does not even guarantee that space has successfully been reserved for the data. In this case, some errors might be delayed until a future write(), fsync(2), or even close(2). The only way to be sure is to call fsync(2) after you are done writing all your data.
Jeżeli write() zostanie przerwany przez obsługe sygnału przed zapisaniem jakichkolwiek danych, wtedy wywołanie nie powiedzie się i zwracany jest błąd EINTR; jeżeli przerwanie nastąpi po zapisaniu co najmniej jednego bajtu danych, wywołanie powiedzie się i zwróci ilość zapisanych bajtów danych.
W Linuksie, write() (i podobne wywołania systemowe) mogą dokonać transferu co najwyżej 0x7ffff000 (2 147 479 552) bajtów, zwracając liczbę bajtów rzeczywiście przetransferowanych (jest to prawdziwe zarówno dla systemów 32 jak i 64-bitowych).
An error return value while performing write() using direct I/O does not mean the entire write has failed. Partial data may be written and the data at the file offset on which the write() was attempted should be considered inconsistent.
Zgodnie z POSIX.1-2008/SUSv4 Section XSI 2.9.7 ("Thread Interactions with Regular File Operations"):
Spośród wymienionych tam dalej API są między innymi write() i writev(2). I spośród efektów, które powinny być atomowe pomiędzy wątkami (i procesami) jest aktualizacja przesunięcia pliku. Jednak w Linuksie przed wersją 3.14 tak się nie działo: jeśli dwa procesy dzielące otwarty deskryptor pliku (zob. open(2)) przeprowadzały write() (lub writev(2)) w tym samym czasie, to operacje wejścia/wyjścia nie były atomowe w odniesieniu do aktualizacji przesunięcia pliku, co powodowało, że bloki danych wypisywane przez dwa procesy mogły się (nieprawidłowo) nakładać. Problem został naprawiony w Linuksie 3.14.
close(2), fcntl(2), fsync(2), ioctl(2), lseek(2), open(2), pwrite(2), read(2), select(2), writev(2), fwrite(3)
Angielska wersja tej strony pochodzi z wydania 5.10 projektu Linux man-pages. Opis projektu, informacje dotyczące zgłaszania błędów oraz najnowszą wersję oryginału można znaleźć pod adresem https://www.kernel.org/doc/man-pages/.
Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Artur Kruszewski <mazdac@gmail.com>, Michał Kułach <michal.kulach@gmail.com> i Robert Luberda <robert@debian.org>
Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.
Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres manpages-pl-list@lists.sourceforge.net.
10 października 2019 r. | Linux |