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
       ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩  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⟩.