когда файловый дескриптор готов к чтению? - PullRequest
0 голосов
/ 09 января 2019

Я новичок в Linux, все еще пытаюсь понять дескриптор файла и прочитать файл. Мой учебник гласит:

"Дескриптор k готов к чтению тогда и только тогда, когда запрос на чтение 1 байта из этого дескриптора не заблокирует"

Допустим, файл на диске имеет 20 байтов, и я только что открыл этот файл и собирался его прочитать, поэтому у него есть дескриптор файла (скажем, fd равен 3). Итак, при каких обстоятельствах этот файловый дескриптор не имеет 1 байта для чтения? Как будто я прочитал 20 байтов для первого чтения, а затем попытался прочитать еще 20 байтов, которые будут заблокированы? Кто-нибудь может дать мне сценарий с этим примером. Спасибо

Ответы [ 2 ]

0 голосов
/ 09 января 2019

«Классический» файловый ввод / вывод Linux использует «блокирующие вызовы» , в отличие от «Асинхронный ввод / вывод» , распространенный в Javascript. Это означает, что если вы хотите что-то «прочитать» или «записать» ... программа «блокируется» до завершения операции ввода-вывода.

Это прекрасно работает, если вы просто хотите «прочитать» одну вещь. Это НЕ работает, если вы хотите прочитать любую из НЕСКОЛЬКИХ разных вещей. Например, если у вас был цикл «событие», ожидающий какого-либо события мыши, клавиатуры или окна.

Я полагаю, что в вашем учебнике говорится о функции select () , которая позволяет блокировать функцию до тех пор, пока один или несколько входов не получат данные.

Это на самом деле не о том, "у этого файла на диске один байт или двадцать?" Скорее, использование «select» позволяет «мультиплексировать» несколько одновременных входов.

Вы также можете найти эту статью полезной:

Linux - мультиплексирование ввода-вывода - выбор против опроса против эполла

0 голосов
/ 09 января 2019

Дисковый файл всегда готов к чтению, он никогда не блокируется. Когда вы откроете свой файл, он будет готов, и вы прочитаете 20 байтов. После этого вы будете читать EOF (что обозначено read(), возвращая длину 0).

Понятие «готов к чтению» применяется к асинхронным устройствам, таким как терминалы и сетевые сокеты. Терминал не будет готов к чтению до тех пор, пока пользователь не наберет что-нибудь (и если терминал находится в обычном «приготовленном» режиме, когда они отправили его, используя клавишу Enter или EOF). Сетевой сокет будет готов к чтению, когда данные будут получены с удаленного компьютера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...