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.