Я читаю исходный код инструмента linux badblocks. Они используют функцию read()
. Есть ли разница в стандартной функции C fread()
? (Я не считаю аргументы разницей.)
В чем разница между read() и fread()?
Ответ 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 кБ, даже если файл еще не закончился.
Это может вызвать незначительные ошибки, поскольку это зависит от того, где хранится файл, кеши и т.д.