-
31. Data: 2018-03-08 08:32:40
Temat: Re: resetowanie urządzenia USB
Od: Zbych <a...@o...pl>
W dniu 08.03.2018 o 00:10, Adam Wysocki pisze:
> Zbych <a...@o...pl> wrote:
>
>> 2. read w trybie blokującym czeka na dane, jak wypnę w trakcie czekania
>> wtyczkę to przerywa czekanie zwracając 0, czego nie traktuję jako błąd.
>> Kolejne wywoływania read zwracają cały czas 0
>
> Wartość 0 oznacza EOF ("koniec pliku", zamknięte połączenie, koniec
> strumienia danych). To coś innego niż brak danych (bo wtedy jak sam
> zauważasz blokujący read poczeka, a nieblokujący zwróci EAGAIN).
Skoro write potrafi zwrócić kod 'Input/output error', to spodziewałbym
się takiego samego kodu błędu po read. To nie jest chwilowy brak danych,
który później się pojawią.
>> Problem polega na tym, że mam urządzenia z który tylko czytam dane
>> (skanery, klawiatury) i takie zachowanie read jest delikatnie mówiąc
>> irytujące.
>
> Hmm, jak dla mnie jest prawidłowe. Po prostu read() nie ma prawa zwrócić
> 0, jeżeli urządzenie jest podłączone i działa, ale nie ma danych. Wartość
> 0 oznacza, że kanał komunikacyjny został zamknięty i dane się skończyły
> (to nie to samo, co chwilowy brak danych, które mogą przyjść później, bo
> strumień jest otwarty; gdy read() zwróci 0, to dane już nie przyjdą).
-
32. Data: 2018-03-08 11:05:30
Temat: Re: resetowanie urządzenia USB
Od: g...@s...invalid (Adam Wysocki)
Zbych <a...@o...pl> wrote:
> Skoro write potrafi zwrócić kod 'Input/output error', to spodziewałbym
> się takiego samego kodu błędu po read. To nie jest chwilowy brak danych,
> który później się pojawią.
Taka już jest konwencja read(). Chwilowy brak danych jest sygnalizowany
przez blokowanie lub EAGAIN, permanentny brak danych przez 0 (EOF). EOF
oznacza "zakończ pracę, bo więcej już nie odczytasz". Czy jest to błąd,
czy normalna sytuacja, to zależy od założeń.
Zakładam, że wywodzi się to stąd, że read() / write() oryginalnie służą
do zapisu / odczytu plików. Gdy czytasz z pliku, to ten plik kiedyś się
skończy i nie jest to błąd, podczas gdy nieudany zapis do pliku zawsze
jest błędem. Przy strumieniach z urządzeń jest podobnie.
Po prostu odłączenie urządzenia jest traktowane jako koniec strumienia,
a nie błąd I/O.
--
[ Email: a@b a=grp b=chmurka.net ]
[ Web: http://www.chmurka.net/ ]
-
33. Data: 2018-03-08 11:42:37
Temat: Re: resetowanie urządzenia USB
Od: Zbych <a...@o...pl>
W dniu 08.03.2018 o 11:05, Adam Wysocki pisze:
> Zbych <a...@o...pl> wrote:
>
>> Skoro write potrafi zwrócić kod 'Input/output error', to spodziewałbym
>> się takiego samego kodu błędu po read. To nie jest chwilowy brak danych,
>> który później się pojawią.
>
> Taka już jest konwencja read(). Chwilowy brak danych jest sygnalizowany
> przez blokowanie lub EAGAIN, permanentny brak danych przez 0 (EOF). EOF
> oznacza "zakończ pracę, bo więcej już nie odczytasz". Czy jest to błąd,
> czy normalna sytuacja, to zależy od założeń.
Przykład z plikiem chyba nie jest najlepszy, bo EOF "teraz" nie znaczy,
że "za chwilę" się tam nic nie pojawi do dalszego czytania. Najprostszy
przykład to logi. EOF w przypadku czytania logów to na pewno nie jest
błąd, po którym nie masz innego wyjścia jak zamknięcie pliku.
-
34. Data: 2018-03-08 13:29:32
Temat: Re: resetowanie urządzenia USB
Od: g...@s...invalid (Adam Wysocki)
Zbych <a...@o...pl> wrote:
> Przykład z plikiem chyba nie jest najlepszy, bo EOF "teraz" nie znaczy,
> że "za chwilę" się tam nic nie pojawi do dalszego czytania. Najprostszy
> przykład to logi. EOF w przypadku czytania logów to na pewno nie jest
> błąd, po którym nie masz innego wyjścia jak zamknięcie pliku.
Zazwyczaj jednak pliki czyta się od początku do końca, a po końcu zamyka.
Sytuacja, w której program przewiduje, że plik jeszcze urośnie, jest
nietypowa. Większość narzędzi Linuksowych standardowo tak się zachowuje.
Jak chcesz przeczytać log "od początku do anulowania" (a nie "od początku
do końca tego, co w nim aktualnie jest") to przecież nie używasz cat,
tylko tail -f.
Zresztą taki "follow" rodzi problem, jeśli plik zostanie w międzyczasie
przycięty, bo wskaźnik pliku nie przesuwa się do początku.
Inna sprawa, że nie da się usunąć pliku, który jest aktualnie otwarty
(można usunąć dowiązanie, ale inode zostaje do momentu zamknięcia), więc
takie zachowanie read() dla pliku ma sens. Czy ma dla urządzenia... widzę
argumenty i za, i przeciw, i pewnie można się kłócić i dyskutować, jak
powinno być, ale obecny stan jest taki, że read() zachowuje się tak, a nie
inaczej... podejrzewam, że ktoś to przemyślał.
--
[ Email: a@b a=grp b=chmurka.net ]
[ Web: http://www.chmurka.net/ ]