¿Cuál es la diferencia entre read () y fread ()?

Estoy leyendo el código fuente de los badblocks de la herramienta de Linux . Usan la función de read() allí. ¿Hay alguna diferencia con la función C fread() estándar? (No estoy contando los argumentos como una diferencia).

read () es una lectura de bajo nivel, sin búfer. Realiza una llamada directa al sistema en UNIX.

fread () es parte de la biblioteca C y proporciona lecturas almacenadas. Por lo general, se implementa llamando a read () para llenar su buffer.

Lectura familiar () -> abrir, cerrar, leer, escribir
Fread de familia () -> fopen, fclose, fread, fwrite

Lectura familiar:

  • son syscalls
  • no están formateados IO: tenemos una secuencia de bytes no formateada

Fread familiar

  • son funciones de la biblioteca C estándar (libc)
  • usa un buffer interno
  • están formateados IO (con el parámetro “% ..”) para algunos de ellos
  • use siempre la memoria caché del búfer de Linux

Más detalles aquí , aunque tenga en cuenta que esta publicación contiene información incorrecta.

read es un syscall, mientras que fread es una función en la biblioteca estándar de C.

Según recuerdo, las API de nivel de lectura () no almacenan en búfer, por lo que si lee () 1 byte a la vez, tendrá una gran penalización de perf en comparación con hacer lo mismo con fread (). fread () sacará un bloque y lo repartirá según lo solicite. read () caerá al núcleo para cada llamada.

Una diferencia que debe tener en cuenta si está convirtiendo el código que usa uno para usar el otro:

  • fread bloques hasta que se haya leído el número de bytes que solicitó, o el archivo finalice, o se produzca un error.
  • read también bloques, pero si lo pides digamos 4kB, puede volver después de leer solo 1kB, incluso si el archivo no ha finalizado.

Esto puede causar errores sutiles, ya que depende de dónde se almacena el archivo, cachés, etc.