Подтвердить что ты не робот

В чем разница между `read` и` sysread`?

read и sysread имеют очень аналогичная документация. Каковы различия между ними?

4b9b3361

Ответ 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 чтения.

Заметки:

  1. К ним относятся, например, связанные дескрипторы файлов и те, которые созданы с использованием open(my $fh, '<', \$var).

  2. До 5.14 Perl считывал 4 блока по КиБ. Начиная с 5.14, размер блоков настраивается при сборке perl, по умолчанию 8 КиБ.

  3. По моему опыту, read вернет именно то количество, которое было запрошено (если возможно) при чтении из простого файла, но может вернуть меньше при чтении из канала. Эти результаты ни в коем случае не гарантированы.

  4. fileno возвращает неотрицательное число для них. К ним относятся, например, дескрипторы, которые читают из простых файлов, из каналов и из сокетов, но не упомянутые в [1].

  5. Я имею в виду 4 аргумента, который вызывается IO :: Select.