Как и в модуле IO::Getline, в модуле IO::LineBufferedSessionData применяется принцип ведения внутреннего буфера данных для хранения частично обработанных строк. При вызове метода getline () этого модуля вначале в этом буфере выполняется поиск полной строки текста. Если таковая будет найдена, то метод getline () ее возвращает. В ином случае он вызывает функцию sysread () для добавления данных к концу буфера и снова предпринимает такую же попытку.
Однако сопровождение внутреннего буфера приводит к таким же проблемам, как и при использовании стандартных функций ввода-вывода в сочетании с функцией select (). Вызов функции select () может указывать, что нет новых данных для чтения из дескриптора, тогда как фактически в буфере хранится полная строка текста. Это значит, что необходимо немного изменить способ применения функции select(). Это сделано путем создания IO::LineBufferedSet , подкласса класса IO::Session Set, откорректированного в целях обеспечения его правильной работы с классом IO::LineBufferedSessionData. В классе IO::LineBufferedSet перекрыт метод wait () родительского класса.
В методе wait () предусмотрен вызов метода sessions () для получения списка контролируемых объектов сеансов. Затем выполняется фильтрация этого списка путем вызова нового метода has_buffered_data (), который возвращает истинное значение, если внутренний буфер данных метода getline () содержит одну или несколько полных строк, предназначенных для чтения.
2014-09-21 02:53:59
это интересно Разнообразие предложений по созданию и продвижению сайтов зачастую ставят под вопрос к кому же стоит обратиться. Веб-студия Махаон выполняет создание сайтов Киев и предлагает обширный спектр услуг по разработке и сопровождению проектов. Оптимальные цены и высокое качество дополнительно порадуют клиентов.