Provided by: manpages-pl-dev_4.23.1-1_all bug

NAZWA

       write - zapisuje do deskryptora pliku

BIBLIOTEKA

       Standardowa biblioteka C (libc, -lc)

SKŁADNIA

       #include <unistd.h>

       ssize_t write(int fd, const void buf[.count], size_t count);

OPIS

       write()  zapisuje  do  count  bajtów,  z  bufora  rozpoczynającego  się w buf, do pliku określonego przez
       deskryptor pliku fd.

       Liczba bajtów zapisanych może być mniejsza niż count jeżeli na przykład:  nie  ma  wystarczającej  ilości
       wolnej  przestrzeni na urządzeniu fizycznym; zasoby RLIMIT_FSIZE zostały wyczerpane (patrz setrlimit(2));
       wywołanie zostało przerwane przez obsługę sygnału, po zapisaniu mniej  niż  count  bajtów  (zob.  również
       podręcznik pipe(7)).

       Dla  przeszukiwalnych  plików  (tj.  takich, na których można użyć lseek(2) np. zwykłych plików) zapis ma
       miejsce w danym przesunięciu pliku i to przesunięcie jest zwiększane o ilość aktualnie zapisanych danych.
       Jeżeli plik został otwarty (open(2)) z O_APPEND wtedy, przed  zapisem,  przesunięcie  jest  ustawiane  na
       koniec  pliku.  Dostosowanie  przesunięcia  pliku  i  operacja  zapisu  są  wykonywane jako nierozdzielne
       (atomowe).

       Standard POSIX wymaga, aby odczyt (read(2)), który może nastąpić po zapisie (write()) zwrócił nowe  dane.
       Prosimy zauważyć, że nie wszystkie systemy plików są zgodne z POSIX.

       Zgodnie  z  POSIX.1,  jeśli  count jest większe niż SSIZE_MAX, wynik zależy od definicji w implementacji;
       zob. UWAGI odnośnie górnego limitu w Linuksie.

WARTOŚĆ ZWRACANA

       Po pomyślnym zakończeniu zwracana jest liczba zapisanych bajtów. Po błędzie zwracane jest -1 i  ustawiane
       errno, wskazując błąd.

       Proszę  zauważyć,  że  pomyślne  write()  może  przetransferować mniej bajtów, niż count. Takie częściowe
       zapisy mogą wystąpić z różnych powodów np. z  powodu  zbyt  małej  dostępnej  przestrzeni  na  urządzeniu
       dyskowym,  do  zapisu  wszystkich  żądanych  bajtów; albo ze względu na przerwanie, zablokowanego write()
       zapisującego do gniazda, potoku itp., przez procedurę obsługi sygnału,  po  transferze  części,  ale  nie
       wszystkich  żądanych danych. W przypadku zapisu częściowego, wywołujący może wykonać kolejne write(), aby
       przetransferować pozostałe bajty. Kolejne wywołanie albo dokona  transferu  dalszych  bajtów,  albo  może
       zawieść z błędem (np. gdy dysk jest teraz pełny).

       Jeżeli  count  jest  zerem  a fd wskazuje na zwykły 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 jest zwracane bez żadnych innych skutków. Jeżeli count jest zerem, a fd odwołuje się
       do pliku innego typu niż zwykły, skutki nie są sprecyzowane.

BŁĘDY

       EAGAIN Deskryptor pliku fd odwołuje się do gniazda i został oznaczony jako nieblokujący  (O_NONBLOCK),  a
              zapis go zablokuje. Zob. open(2) aby dowiedzieć się więcej o znaczniku O_NONBLOCK.

       EAGAIN lub EWOULDBLOCK
              Deskryptor  pliku  fd odwołuje się do gniazda i został oznaczony jako nieblokujący (O_NONBLOCK), a
              zapis go zablokuje. POSIX.1-2001 pozwala w tej sytuacji na zwrócenie błędu ale nie wymaga  aby  ta
              stała miała taką samą wartość, portowalna aplikacja powinna sprawdzać obie możliwości.

       EBADF  fd nie jest prawidłowym deskryptorem pliku lub nie jest otwarty do zapisu.

       EDESTADDRREQ
              fd  odwołuje  się  do  gniazda  datagramowego  dla  którego  adres nie został ustalony przy użyciu
              connect(2).

       EDQUOT Przydział bloków dyskowych użytkownika, dotyczący systemu plików zawierającego plik wskazany przez
              fd, został wyczerpany.

       EFAULT buf jest poza dostępną przestrzenią adresową.

       EFBIG  Dokonano próby zapisu pliku, który przekracza zdefiniowane  w  implementacji  maksymalne  rozmiary
              pliku,  rozmiary  pliku  procesu  lub  zapis  na  pozycję  wykraczającą  poza maksymalne dozwolone
              przesunięcie.

       EINTR  Wywołanie zostało przerwane przez sygnał, przed zapisaniem jakichkolwiek danych, patrz signal(7).

       EINVAL fd jest dołączony do obiektu nieodpowiedniego  do  zapisu,  plik  został  otwarty  ze  znacznikiem
              O_DIRECT,  a  adres  podany  w  buf  bądź  wartość  count lub przesunięcie nie zostały odpowiednio
              dopasowane.

       EIO    Wystąpił niskopoziomowy błąd wejścia/wyjścia  podczas  modyfikacji  i-węzła.  Błąd  ten  może  być
              związany  z  kończeniem  zapisywania  danych  wcześniejszego write(), które mogło być wydane wobec
              innego deskryptora pliku odnoszącego się do tego samego pliku. Od Linuksa 4.13, błędy wynikające z
              kończenia zapisywania wcześniejszego wywołania mogą być zgłoszone przez kolejne żądanie write()  i
              będą zgłoszone przez kolejne fsync(2) (niezależnie od ewentualnego wcześniejszego zgłoszenia przez
              write()).  Alternatywnym powodem błędu EIO w sieciowych systemach plików, może być zdjęcie blokady
              doradczej z deskryptora pliku i zagubienie tej blokady. Więcej informacji  w  rozdziale  Zagubione
              blokady w podręczniku fcntl(2).

       ENOSPC Urządzenie zawierające plik wskazany przez fd nie ma miejsca na dane.

       EPERM  Operacja zablokowana, z powodu zapieczętowania pliku (ang. file seal); zob. fcntl(2).

       EPIPE  fd  jest  podłączony  do  potoku  lub  gniazda, którego koniec do odczytu jest zamknięty. Gdy taka
              sytuacja następuje, proces zapisujący również otrzyma sygnał SIGPIPE (więc wartość zwracana  przez
              zapisującego jest widziana tylko wówczas, gdy program obsługuje, blokuje lub ignoruje ten sygnał).

       Zależnie od obiektu podłączonego do fd, mogą także zajść inne (nieopisane) błędy.

STANDARDY

       POSIX.1-2008.

HISTORIA

       SVr4, 4.3BSD, POSIX.1-2001.

       Pod  SVr4  zapis  może  być  przerwany,  a  błąd EINTR zwrócony, w dowolnym momencie, nie tylko tuż przed
       zapisem jakichkolwiek danych.

UWAGI

       Pomyślny powrót z write() nie daje gwarancji, że  dane  zostały  faktycznie  zapisane  na  urządzeniu.  W
       niektórych  systemach plików, w tym NFS, nie ma nawet pewności, że przestrzeń potrzebna do zapisu została
       pomyślnie zarezerwowana. W takim przypadku, niektóre błędy  mogą  być  odłożone  do  kolejnego  wywołania
       write(),  fsync(2) lub nawet close(2). Jedynym sposobem, aby mieć pewność, że dane zostały zapisane, jest
       wywołanie fsync(2), po zakończeniu zapisywania wszystkich danych przez write().

       Jeżeli write() zostanie przerwany przez obsługę 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).

       Błąd zwracany przy wykonywaniu write(), używającego bezpośredniego wejścia/wyjścia, nie oznacza, że  cały
       zapis  się  nie  powiódł.  Część danych mogła być zapisana, dlatego dane na przesunięciu pliku, na którym
       write() próbował zapisywać, należy uważać za niespójne.

USTERKI

       Zgodnie z POSIX.1-2008/SUSv4 Section XSI 2.9.7 („Thread Interactions with Regular File Operations”):

           Wszystkie poniższe funkcje powinny być atomowe w odniesieniu  do  innych,  biorąc  pod  uwagę  wyniki
           określone w POSIX.1-2008, gdy działają na zwykłych plikach lub dowiązaniach symbolicznych: ...

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

ZOBACZ TAKŻE

       close(2), fcntl(2), fsync(2), ioctl(2), lseek(2),  open(2),  pwrite(2),  read(2),  select(2),  writev(2),
       fwrite(3)

TŁUMACZENIE

       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  listy  dyskusyjnej  manpages-pl-
       list@lists.sourceforge.net.

Linux man-pages 6.8                              2 maja 2024 r.                                         write(2)