В чем разница между read () и fread ()? - PullRequest
45 голосов
/ 25 февраля 2009

Я читаю исходный код инструмента linux badblocks . Там они используют функцию read(). Есть ли разница со стандартной функцией C fread()? (Я не считаю аргументы разницей.)

Ответы [ 5 ]

53 голосов
/ 25 февраля 2009

read() - низкоуровневое чтение без буферизации. Это делает прямой системный вызов в UNIX.

fread() является частью библиотеки C и обеспечивает буферизованные чтения. Обычно это осуществляется путем вызова read() для заполнения буфера.

35 голосов
/ 25 февраля 2009

Семейство read() -> open, close, read, write
Семейство fread() -> fopen, fclose, fread, fwrite

Семейное чтение:

  • системные вызовы
  • не форматированный IO: у нас есть неформатированный поток байтов

Семейный фред

  • являются функциями стандартной библиотеки C (libc)
  • использовать внутренний буфер
  • форматируются IO (с параметром "% ..") для некоторых из них
  • всегда использовать буферный кеш Linux

Подробнее здесь , хотя обратите внимание, что в этом посте содержится неверная информация.

7 голосов
/ 25 февраля 2009

read - системный вызов, тогда как fread - это функция в стандартной библиотеке C.

6 голосов
/ 25 февраля 2009

Насколько я помню, API уровня read() не выполняют буферизацию - поэтому, если вы будете read() 1 байт за раз, вы получите огромный штраф за перфорирование по сравнению с тем же самым действием с fread(). fread() вытащит блок и раздаст его, как вы просите. read() будет сбрасываться в ядро ​​для каждого вызова.

3 голосов
/ 08 марта 2017

Одно отличие, о котором вам следует знать, если вы конвертируете код, использующий один, в другой:

  • fread блокируется до тех пор, пока не будет прочитано количество запрошенных вами байтов, или файл завершится или возникнет ошибка.
  • read также блокируется, но если вы попросите, скажем, 4 КБ, он может вернуться после прочтения всего 1 КБ, даже если файл не закончился.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...