read(2) System Calls Manual read(2) NAZWA read - odczytuje z deskryptora pliku BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include ssize_t read(size_t count; int fd, void buf[count], size_t count); OPIS read() probuje odczytac maksymalnie count bajtow z deskryptora plikow fd do bufora, ktorego poczatek znajduje sie w buf. W przypadku plikow, ktore obsluguja przeszukiwanie (seeking), operacja odczytu rozpoczyna sie od przesuniecia pliku i przesuniecie pliku jest zwiekszane o liczbe odczytanych bajtow. Jesli przesuniecie pliku jest na koncu pliku lub poza nim, nie sa odczytywane bajty, a read() zwraca zero. Jesli count wynosi zero, read() moze wykryc bledy opisane ponizej. Przy braku bledow lub gdy read() nie sprawdza bledow, read() z count wynoszacym 0, wylacznie zwraca zero, nie wykonujac innych dzialan. Zgodnie z POSIX.1, jesli count jest wieksze niz SSIZE_MAX, wynik zalezy od definicji w implementacji; zob. UWAGI odnosnie gornego limitu w Linuksie. WARTOSC ZWRACANA Po pomyslnym zakonczeniu zwracana jest liczba odczytanych bajtow (zero oznacza koniec pliku), oraz o te wartosc przesuwana jest pozycja w pliku. Nie jest bledem, jesli liczba ta jest mniejsza niz liczba zadanych bajtow; moze sie to zdarzyc np. poniewaz chwilowo dostepnych jest mniej bajtow (moze z powodu bliskosci konca plikow, a moze z powodu czytania z potoku lub z terminala), lub poniewaz read() zostalo przerwane sygnalem. Po bledzie zwracane jest -1 i ustawiane errno wskazujac blad. W tym przypadku nie jest okreslone czy pozycja w pliku sie zmieni. BLEDY EAGAIN Deskryptor pliku fd odwoluje sie do pliku innego niz gniazdo i zostal oznaczony jako nieblokujacy (O_NONBLOCK), a odczyt go zablokuje. Zob. open(2) aby dowiedziec sie wiecej o fladze O_NONBLOCK. EAGAIN lub EWOULDBLOCK Deskryptor pliku fd odwoluje sie do gniazda i zostal oznaczony jako nieblokujacy (O_NONBLOCK), a odczyt go zablokuje. POSIX.1-2001 pozwala w tej sytuacji na zwrocenie bledu ale nie wymaga aby ta stala miala taka sama wartosc, przenosna aplikacja powinna sprawdzac obie mozliwosci. EBADF fd nie jest prawidlowym deskryptorem pliku, lub nie jest otwarty dla odczytu. EFAULT buf jest poza dostepna przestrzenia adresowa. EINTR Wywolanie zostalo przerwane sygnalem przed odczytaniem danych; zob. signal(7). EINVAL fd jest dolaczony do obiektu nieodpowiedniego do odczytu, plik zostal otwarty ze znacznikiem O_DIRECT i adres podany w buf badz wartosc count lub przesuniecie nie zostaly odpowiednio dopasowane. EINVAL fd utworzono przez wywolanie timerfd_create(2) i do read() podano nieprawidlowy rozmiar bufora; wiecej informacji w podreczniku timerfd_create(2). EIO Blad wejscia/wyjscia. Zdarza sie to na przyklad, gdy proces jest w grupie procesow tla, probuje czytac z kontrolujacego terminala, i blokuje lub ignoruje sygnal SIGTTIN, lub jego grupa procesow jest osierocona. Moze sie to rowniez zdarzyc, gdy wystapi niskopoziomowy blad wejscia/wyjscia podczas odczytu z dysku lub tasmy. Kolejna mozliwoscia, na sieciowych systemach plikow, jest sytuacja, gdy blokada doradcza zostala sciagnieta z deskryptora pliku i blokada ta zostala zagubiona. Wiecej informacji w rozdziale Zagubione blokady podrecznika fcntl(2). EISDIR fd odnosi sie do katalogu. Zaleznie od obiektu podlaczonego do fd, moga takze zajsc inne (nieopisane) bledy. STANDARDY POSIX.1-2008. HISTORIA SVr4, 4.3BSD, POSIX.1-2001. UWAGI W Linuksie, read() (i podobne wywolania systemowe) moga dokonac transferu co najwyzej 0x7ffff000 (2 147 479 552) bajtow, zwracajac liczbe bajtow rzeczywiscie przetransferowanych (jest to prawdziwe zarowno w systamach 32- jak i 64-bitowych). Na systemach plikow NFS, odczytanie niewielkiej ilosci danych spowoduje uaktualnienie znacznika czasu tylko za pierwszym razem, nastepne wywolania tego nie uczynia. Jest to zwiazana z buforowaniem atrybutow po stronie klienta, gdyz wiekszosc (jezeli nie wszystkie) klienty NFS pozostawiaja uaktualnianie st_atime (czasu ostatniego dostepu do pliku) serwerowi, a odczyty po stronie klienta, odbywajace sie z buforow klienta nie spowoduja uaktualnienia st_atime na serwerze, gdyz nie ma wowczas odczytow po stronie serwera. Semantyke UNIX-a mozna uzyskac poprzez wylaczenie buforowania atrybutow po stronie klienta. Jednakze, w wiekszosci przypadkow spowoduje to istotny wzrost obciazenia serwera i zmniejszy wydajnosc. USTERKI Zgodnie z POSIX.1-2008/SUSv4 Section XSI 2.9.7 (,,Thread Interactions with Regular File Operations"): Wszystkie ponizsze funkcje powinny byc atomowe w odniesieniu do innych, biorac pod uwage wyniki okreslone w POSIX.1-2008, gdy dzialaja na zwyklych plikach lub dowiazaniach symbolicznych: ... Sposrod wymienionych tam dalej API sa miedzy innymi read() i readv(2). I sposrod efektow, ktore powinny byc atomowe pomiedzy watkami (i procesami) jest aktualizacja przesuniecia pliku. Jednak przed Linuksem 3.14 tak sie nie dzialo: jesli dwa procesy dzielace otwarty deskryptor pliku (zob open(2)) przeprowadzaly read() (lub readv(2)) w tym samym czasie, to operacje wejscia/wyjscia nie byly niepodzielne w odniesieniu do aktualizacji przesuniecia pliku, co powodowalo, ze bloki danych odczytywane przez dwa procesy mogly sie (nieprawidlowo) nakladac, w blokach danych, ktore uzyskaly. Problem zostal naprawiony w Linuksie 3.14. ZOBACZ TAKZE close(2), fcntl(2), ioctl(2), lseek(2), open(2), pread(2), readdir(2), readlink(2), readv(2), select(2), write(2), fread(3) TLUMACZENIE Tlumaczenie niniejszej strony podrecznika: Przemek Borys , Andrzej Krzysztofowicz i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.18 8 lutego 2026 r. read(2)