write

WRITE(2)                PodrÄcznik programisty Linuksa                WRITE(2)



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)