Provided by: manpages-pl-dev_4.13-4_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()   writes up to count bytes from the buffer starting at buf to the file referred to
       by the file descriptor 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).

       POSIX requires that a read(2)  that can be proved to occur after a write()   has  returned
       will return the new data.  Note that not all filesystems are POSIX conforming.

       According   to   POSIX.1,   if   count   is   greater   than   SSIZE_MAX,  the  result  is
       implementation-defined; see NOTES for the upper limit on Linux.

WARTOŚĆ ZWRACANA

       On success, the number of bytes written is returned.  On error, -1 is returned, and  errno
       is set to indicate the cause of the error.

       Note  that a successful write()  may transfer fewer than count bytes.  Such partial writes
       can occur for various reasons; for example, because there was insufficient  space  on  the
       disk  device  to  write  all  of  the  requested bytes, or because a blocked write()  to a
       socket, pipe, or similar was interrupted by a signal  handler  after  it  had  transferred
       some, but before it had transferred all of the requested bytes.  In the event of a partial
       write, the caller can make another write()  call to transfer  the  remaining  bytes.   The
       subsequent call will either transfer further bytes or may result in an error (e.g., if the
       disk is now full).

       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    A low-level I/O error occurred while modifying the inode.  This error may relate to
              the write-back of data written by an earlier write(), which may have been issued to
              a different file descriptor on the  same  file.   Since  Linux  4.13,  errors  from
              write-back  come  with  a promise that they may be reported by subsequent.  write()
              requests, and will be reported by a subsequent fsync(2)  (whether or not they  were
              also  reported  by write()).  An alternate cause of EIO on networked filesystems is
              when an advisory lock had been taken out on the file descriptor and this  lock  has
              been lost.  See the Lost locks section of fcntl(2)  for further details.

       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.

       A successful return from write()  does not make any guarantee that data has been committed
       to disk.  On some filesystems, including NFS, it does not even guarantee  that  space  has
       successfully been reserved for the data.  In this case, some errors might be delayed until
       a future write(), fsync(2), or even close(2).  The only way to be sure is to call fsync(2)
       after you are done writing all your data.

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

       An error return value while performing write()  using direct I/O does not mean the  entire
       write has failed. Partial data may be written and the data at the file offset on which the
       write()  was attempted should be considered inconsistent.

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