Provided by: manpages-pl-dev_0.7-1_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.