Scroll to navigation

READ(2) Podręcznik programisty Linuksa READ(2)

NAZWA

read - odczyt z deskryptora pliku

SKŁADNIA

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);

OPIS

read() próbuje odczytać maksymalnie count bajtów z deskryptora plików fd do bufora, którego początek znajduje się w buf.

Jeśli count jest równe zero, read() zwraca zero i nic więcej się nie dzieje. Jeśli count jest większe niż SSIZE_MAX, wynik jest nieokreślony.

WARTOŚĆ ZWRACANA

Po pomyślnym zakończeniu zwracana jest liczba odczytanych bajtów (zero oznacza koniec pliku), oraz o tę wartość przesuwana jest pozycja w pliku. Nie jest błędem, jeśli liczba ta jest mniejsza niż liczba żądanych bajtów; może się to zdarzyć np. ponieważ chwilowo dostępnych jest mniej bajtów (może z powodu bliskości końca plików, a może z powodu czytania z potoku lub z terminala), lub ponieważ read() zostało przerwane sygnałem. Po błędzie zwracane jest -1 i odpowiednio ustawiane errno. W tym wypadku nie jest określone czy pozycja w pliku się zmieni.

BŁĘDY

Wywołanie zostało przerwane sygnałem przed odczytaniem danych.
Przy użyciu O_NONBLOCK wybrano nieblokujące we/wy, a nie ma akurat danych dostępnych do odczytania natychmiast.
Błąd we/wy. Zdarza się to na przykład, gdy proces jest w grupie procesów tła próbuje czytać z kontrolującego tty, i blokuje lub ignoruje sygnał SIGTTIN, lub jego grupa procesów jest osierocona. Może się to również zdarzyć, gdy wystąpi niskopoziomowy błąd we/wy podczas odczytu z dysku lub taśmy.
fd odnosi się do katalogu.
fd nie jest prawidłowym deskryptorem pliku, lub nie jest otwarty dla odczytu.
fd wskazuje na obiekt nieodpowiedni do odczytu.
fd jest skojarzony z obiektem, który nie jest odpowiedni dla odczytu.
buf wskazuje poza dostępną dla użytkownika przestrzeń adresową.

Mogą się pojawić inne błędy, zależnie od obiektu skojarzonego z fd. POSIX zezwala by read którego przerwano po odczytaniu fragmentu danych zwrócił -1 (z errno ustawionym na EINTR) lub by zwróćił ilość odczytanych bajtów.

ZGODNE Z

SVr4, SVID, AT&T, POSIX, X/OPEN, BSD 4.3

OGRANICZENIA

Na systemach plików NFS, odczytanie niewielkiej ilości danych spowoduje uaktualnienie znacznika czasu tylko za pierwszym razem. Następne wywołania tego nie uczynią. Jest to związana z buforowaniem atrybutów po stronie klienta, gdyż większość (jeżeli nie wszystkie) klienty NFS pozostawiają uaktualnianie atime serwerowi, a odczyty po stronie klienta, odbywające się z buforów klienta nie spowodują uaktualnienia atime na serwerze, gdyż nie ma wówczas odczytów po stronie serwera. Semantykę UNIX-a można uzyskać poprzez wyłączenie buforowania atrybutów po stronie klienta. Jednakże, w większości przypadków spowoduje to istotny wzrost obciążenia serwera i zmniejszy wydajność.

Wiele systemów plików i dysków jest uważane za dostatecznie szybkie, aby implementacja O_NONBLOCK była uważana za zbędną. Tak więc, O_NONBLOCK może nie być dostępne dla plików i/lub dysków.

ZOBACZ TAKŻE

close(2), fcntl(2), ioctl(2), lseek(2), readdir(2), readlink(2), select(2), write(2), fread(3)

1997-07-12 Linux 2.0.32