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

В чем разница между read() и fread()?

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

4b9b3361

Ответ 1

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

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

Ответ 2

Семья read() → открыть, закрыть, прочитать, написать
Family fread() → fopen, fclose, fread, fwrite

Семейство:

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

Семейный фуд

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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