4-Довод-Select-Вопрос - PullRequest
       32

4-Довод-Select-Вопрос

1 голос
/ 21 февраля 2011

От SELECT_TUT:

"... используется для эффективного мониторинга нескольких файловых дескрипторов, чтобы увидеть, является ли какой-либо из них" готовым "или становится" готовым "; то есть, чтобы увидеть, становится ли возможен ввод / вывод, или" исключительное условие "имеет произошло на любом из дескрипторов. ...

Так в чем же смысл select ()? Разве я не могу просто читать и писать в свои дескрипторы, когда захочу? Суть select () заключается в том, что он просматривает несколько дескрипторов одновременно и правильно переводит процесс в спящий режим, если не выполняется никаких действий. Программисты Unix часто оказываются в положении, когда им приходится обрабатывать ввод-вывод из более чем одного файлового дескриптора, где поток данных может быть прерывистым. Если вы просто создадите последовательность вызовов read (2) и write (2), вы обнаружите, что один из ваших вызовов может блокировать ожидание данных из / в файловый дескриптор, в то время как другой файловый дескриптор не используется, хотя и готов для I / вывода. select () эффективно справляется с этой ситуацией. "

Может ли кто-нибудь объяснить мне, что это значит и как это работает, может быть, с небольшим примером.

Например, здесь выбран только один дескриптор файла, зачем мне нужен мониторинг?

my $timeout = 10;
my ( $in, $out ) = ( '', '' );
vec( $in, fileno( STDIN ), 1 ) = 1;
select( $out = $in, undef, undef, $timeout );

1 Ответ

7 голосов
/ 21 февраля 2011

Чтение из файлового дескриптора является операцией блокировки. Если вы пытаетесь читать из STDIN, и нет ввода, ваша программа будет ждать, пока ввод не будет. Эффект можно проиллюстрировать, запустив программу-фильтр, например, grep без ввода:

$ grep foo
_

grep ждет ввода. Если вы что-то наберете и нажмете Ctl-d, чтобы закрыть STDIN, чтение grep получит ваш ввод, проверит совпадение, напечатает совпадение, если оно есть, и выйдет.

Теперь представьте, что вы пишете сетевое приложение, такое как IRC-клиент, который должен выполнять чтение из нескольких разных соединений во время выполнения основного цикла графического интерфейса. Эту проблему решает select ().

Вот статья, которая должна дать вам подробное объяснение: http://www.perlfect.com/articles/select.shtml

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