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

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

Ответов (6)

Решение

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

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

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

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

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

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

read () -> Непосредственно используя этот системный вызов ядра и выполняющий операцию ввода-вывода.

fread () -> Это функция, представленная в стандартной библиотеке.

Вызов fread() в основном используется для данных двоичного файла, в котором хранятся данные структуры. Основное различие между ними - количество системных вызовов в вашем приложении.

fread() Вид функций стандартной библиотеки ввода - вывода оптимизированы для системных вызовов, а ваше приложение делает системные вызовы.

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

Семья read() -> open, close, read,write
Семья fread() -> fopen, fclose, fread,fwrite

Семья прочитала:

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

Семья fread

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

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