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óre mogą nastąpić po write() zwrócił nowe dane. Pamiętaj, że nie wszystkie systemy plików są zgodne z POSIX.

ZWRACANA WARTOŚĆ
Po pomyślnym wykonaniu, zwracana jest liczba zapisanych bajtów (zero informuje, że nic nie zostało zapisane). Przy błędzie 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, 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.

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.

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.

ZGODNOŚĆ
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
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.

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 3.52 projektu Linux man-pages. Opis projektu oraz informacje dotyczące zgłaszania błędów można znaleźć pod adresem http://www.kernel.org/doc/man-pages/.

TŁUMACZENIE
Autorami polskiego tłumaczenia niniejszej strony podręcznika man są: Artur Kruszewski <mazdac@gmail.com> i Michał Kułach <michal.kulach@gmail.com>.

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ą 3.52 oryginału.