Provided by: manpages-pl-dev_0.7-2_all bug

NAZWA

       write - zapisuje do deskryptora pliku

SKŁADNIA

       #include <unistd.h>

       ssize_t write(int fd, const void *buf, size_t liczba);

OPIS

       write()  zapisuje  do  liczba  bajtów z bufora wskazanego przez buf do pliku określonego przez deskryptor
       pliku 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).

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

WARTOŚĆ ZWRACANA

       Po pomyślnym wykonaniu, zwracana jest liczba zapisanych  bajtów  (zero  informuje,  że  nic  nie  zostało
       zapisane). Nie jest błędem, jeśli liczba ta jest mniejsza niż liczba żądanych bajtów; może się to zdarzyć
       na przykład z powodu zapełnienia dysku. Zob. też UWAGI.

       W razie wystąpienia błędu zwracane jest -1 i ustawiana jest odpowiednia wartość zmiennej errno.

       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.

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 fladze 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 Kwota bloków dyskowych użytkownika dotycząca systemu plików zawierającego plik wskazany  przez  fd
              została wyczerpana.

       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 (offset).

       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 z flagą O_DIRECT i
              adres podany w  buf  bądź  wartość  liczba  lub  przesunięcie  (offset)  nie  zostały  odpowiednio
              dopasowane.

       EIO    Podczas modyfikacji i-węzła nastąpił niskopoziomowy błąd wejścia/wyjścia.

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

       EPERM  Operacja zablokowana przez zakluczenie pliku (ang. file seal); zob. fcntl(2).

       EPIPE  fd  jest  podłączony  do  potoku  (pipe)  lub  gniazda  (socket) którego końcówka odczytująca jest
              zamknięta. Gdy taka sytuacja następuje, proces zapisujący również otrzyma sygnał   SIGPIPE.  (Więc
              wartość  zwracana  przez  write()  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.

ZGODNE Z

       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.

UWAGI

       Typy size_t i ssize_t to odpowiednio liczba całkowita bez i ze znakiem, zgodnie z POSIX.1.

       Pomyślny  powrót  z  write()  nie  daje  gwarancji,  że dane zostały faktycznie zapisane na urządzeniu. W
       rzeczywistości, w niektórych wadliwych implementacjach, nie ma nawet pewności, że przestrzeń potrzebna do
       zapisu została pomyślnie zarezerwowana. Jedynym sposobem aby mieć pewność, że dane zostały zapisane  jest
       wywołanie  fsync(2)  po skończeniu zapisywania wszystkich danych przez write().

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

BŁĘDY

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

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)

O STRONIE

       Angielska wersja tej strony pochodzi z wydania 4.07 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/.

TŁUMACZENIE

       Autorami polskiego tłumaczenia niniejszej strony podręcznika man są: Artur Kruszewski <mazdac@gmail.com>,
       Michał Kułach <michal.kulach@gmail.com> i Robert Luberda <robert@debian.org>.

       Polskie tłumaczenie jest częścią  projektu  manpages-pl;  uwagi,  pomoc,  zgłaszanie  błędów  na  stronie
       http://sourceforge.net/projects/manpages-pl/. Jest zgodne z wersją  4.07 oryginału.

Linux                                              2016-03-15                                           WRITE(2)