read и sysread имеют очень аналогичная документация. Каковы различия между ними?
В чем разница между `read` и` sysread`?
Ответ 1
О read:
-
readподдерживает слои PerlIO. -
readработает с любым дескриптором файла Perl [1]. -
readбуферы. -
readполучает данные из системы в блоках фиксированного размера 8 КиБ [2]. -
readможет заблокировать, если доступно меньше данных, чем запрошено [3].
О sysread:
-
sysreadне поддерживает слои PerlIO (это означает, что он требует простой двоичный дескриптор). -
sysreadработает только с дескрипторами файлов Perl, которые отображаются на дескриптор/дескриптор системного файла [4]. -
sysreadне буферизуется. -
sysreadвыполняет один системный вызов. -
sysreadнемедленно возвращает данные, если данные доступны для возврата, даже если объем данных меньше запрашиваемого объема.
Резюме и выводы:
-
readработает с любым дескриптором файла Perl, в то время какsysreadограничен дескрипторами файла Perl, сопоставленными с дескриптором/дескриптором системного файла. -
readне совместим сselect[5] аsysreadсовместим сselect. -
readможет выполнить декодирование для вас, в то время какsysreadтребует, чтобы вы выполняли свое собственное декодирование. -
readдолжно быть быстрее для очень маленькихsysreadчтения, в то время какsysreadдолжно быть быстрее для очень большихsysreadчтения.
Заметки:
-
К ним относятся, например, связанные дескрипторы файлов и те, которые созданы с использованием
open(my $fh, '<', \$var). -
До 5.14 Perl считывал 4 блока по КиБ. Начиная с 5.14, размер блоков настраивается при сборке
perl, по умолчанию 8 КиБ. -
По моему опыту,
readвернет именно то количество, которое было запрошено (если возможно) при чтении из простого файла, но может вернуть меньше при чтении из канала. Эти результаты ни в коем случае не гарантированы. -
filenoвозвращает неотрицательное число для них. К ним относятся, например, дескрипторы, которые читают из простых файлов, из каналов и из сокетов, но не упомянутые в [1]. -
Я имею в виду 4 аргумента, который вызывается IO :: Select.