Как я могу определить, есть ли данные в буфере входного файлового дескриптора в Perl? - PullRequest
2 голосов
/ 18 ноября 2009

Я работаю над программой, которая использует основанный на epoll цикл обработки событий для обработки нескольких одновременных соединений сокетов. Когда приложение обнаруживает, что есть данные для чтения, оно вызывает подпрограмму process_request (), которая использует буферизованный ввод-вывод. Например:

sub process_request {
    my ( $fh ) = @_;
    if ( my $line = <$fh> ) {
        # Do something interesting
    }
}

Проблема в том, что при использовании буферизованного ввода-вывода здесь epoll не знает, что в буфере ожидают непрочитанные данные, поэтому он больше не вызывает process_request ().

Итак, вопрос в том, как я могу определить, есть ли непрочитанные данные в дескрипторе файла в Perl, чтобы я мог снова вызывать process_request (), пока данные остаются в буфере?

1 Ответ

1 голос
/ 18 ноября 2009

Хорошо, я знаю, что вы используете свой собственный цикл событий, а не POE, но вы все равно можете позаимствовать фильтры POE; они могут быть загружены без использования остальных POE. Инициализируйте POE::Filter::Line на сокет, и когда сокет станет читаемым, сделайте неблокирующее read для всего, что есть, и вставьте их в фильтр с помощью $filter->get. Возвращаемое значение будет представлять собой arrayref из (0 или более) строк, и любые частичные строки будут сохранены в фильтре в ожидании остальной части строки.

Если это не понравится, ну, вы всегда можете реализовать ту же идею самостоятельно. Это не большой объем работы, в основном строковый буфер на сокет и совпадение с регулярным выражением.

...