oracular (2) read.2.gz

Provided by: manpages-pl-dev_4.23.1-1_all bug

NAZWA

       read - odczytuje z deskryptora pliku

BIBLIOTEKA

       Standardowa biblioteka C (libc, -lc)

SKŁADNIA

       #include <unistd.h>

       ssize_t read(int fd, void buf[.count], 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.

       W przypadku plików,  które  obsługują  przeszukiwanie  (seeking),  operacja  odczytu  rozpoczyna  się  od
       przesunięcia  pliku  i przesunięcie pliku jest zwiększane o liczbę odczytanych bajtów. Jeśli przesunięcie
       pliku jest na końcu pliku lub poza nim, nie są odczytywane bajty, a read() zwraca zero.

       Jeśli count wynosi zero, read()  może wykryć błędy opisane poniżej. Przy braku błędów lub gdy read()  nie
       sprawdza błędów, read() z count wynoszącym 0, wyłącznie zwraca zero, nie wykonując innych działań.

       Zgodnie  z  POSIX.1,  jeśli  count jest większe niż SSIZE_MAX, wynik zależy od definicji w implementacji;
       zob. UWAGI odnośnie górnego limitu w Linuksie.

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 ustawiane errno wskazując błąd. W tym  przypadku  nie  jest  określone  czy
       pozycja w pliku się zmieni.

BŁĘDY

       EAGAIN Deskryptor  pliku fd odwołuje się do pliku innego niż gniazdo i został oznaczony jako nieblokujący
              (O_NONBLOCK), a odczyt 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
              odczyt  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ść, przenośna aplikacja powinna sprawdzać obie możliwości.

       EBADF  fd nie jest prawidłowym deskryptorem pliku, lub nie jest otwarty dla odczytu.

       EFAULT buf jest poza dostępną przestrzenią adresową.

       EINTR  Wywołanie zostało przerwane sygnałem przed odczytaniem danych; zob. signal(7).

       EINVAL fd jest dołączony do obiektu nieodpowiedniego do  odczytu,  plik  został  otwarty  ze  znacznikiem
              O_DIRECT  i  adres  podany  w  buf  bądź  wartość  count  lub przesunięcie nie zostały odpowiednio
              dopasowane.

       EINVAL fd utworzono przez wywołanie timerfd_create(2) i do read() podano  nieprawidłowy  rozmiar  bufora;
              więcej informacji w podręczniku timerfd_create(2).

       EIO    Błąd  wejścia/wyjścia.  Zdarza  się to na przykład, gdy proces jest w grupie procesów tła, próbuje
              czytać z kontrolującego terminala, 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 wejścia/wyjścia
              podczas odczytu z dysku lub taśmy. Kolejną  możliwością,  na  sieciowych  systemach  plików,  jest
              sytuacja,  gdy  blokada  doradcza  została  ściągnięta  z  deskryptora  pliku i blokada ta została
              zagubiona. Więcej informacji w rozdziale Zagubione blokady podręcznika fcntl(2).

       EISDIR fd odnosi się do katalogu.

       Zależnie od obiektu podłączonego do fd, mogą także zajść inne (nieopisane) błędy.

STANDARDY

       POSIX.1-2008.

HISTORIA

       SVr4, 4.3BSD, POSIX.1-2001.

UWAGI

       W Linuksie, read() (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 w systamach 32- jak i 64-bitowych).

       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 st_atime
       (czasu  ostatniego  dostępu  do  pliku) serwerowi, a odczyty po stronie klienta, odbywające się z buforów
       klienta nie spowodują uaktualnienia st_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ść.

USTERKI

       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 read() i readv(2). I spośród efektów, które powinny
       być atomowe pomiędzy wątkami (i procesami) jest aktualizacja przesunięcia pliku.  Jednak  przed  Linuksem
       3.14 tak się nie działo: jeśli dwa procesy dzielące otwarty deskryptor pliku (zob open(2)) przeprowadzały
       read() (lub readv(2)) w tym samym czasie, to operacje wejścia/wyjścia nie były niepodzielne w odniesieniu
       do  aktualizacji  przesunięcia  pliku, co powodowało, że bloki danych odczytywane przez dwa procesy mogły
       się (nieprawidłowo) nakładać, w blokach danych, które uzyskały.  Problem  został  naprawiony  w  Linuksie
       3.14.

ZOBACZ TAKŻE

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

TŁUMACZENIE

       Autorami polskiego tłumaczenia niniejszej strony podręcznika  są:  Przemek  Borys  <pborys@dione.ids.pl>,
       Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl> i Michał Kułach <michal.kulach@gmail.com>

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