oracular (2) write.2.gz

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⟩.