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


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

Author: AIB, 2009-02-25

5 answers

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

Fread() es parte de la biblioteca C, y proporciona lecturas en búfer. Normalmente se implementa llamando a read () para llenar su búfer.

 51
Author: Darron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-24 23:43:30

Family read () - > open, close, read, write
Familia fread () - > fopen, fclose, fread, fwrite

La familia debe decir:

  • son llamadas de sistema
  • no tienen formato IO: tenemos un flujo de bytes no formateado

Familia fread

  • son funciones de la biblioteca C estándar (libc)
  • utilice un búfer interno
  • están formateados IO (con el "%.."parámetro) para algunos de ellos
  • utilice siempre el búfer de Linux cache

Más detalles aquí, aunque tenga en cuenta que este post contiene alguna información incorrecta.

 33
Author: AIB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-08 18:36:54

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

 6
Author: phihag,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-24 23:43:15

Según recuerdo, las API de nivel read() no hacen buffering, por lo que si lees() 1 byte a la vez, tendrás una gran penalización de perf en comparación con hacer lo mismo con fread(). fread() tirará de un bloque y lo repartirá a medida que lo pidas. read () caerá en el núcleo para cada llamada.

 6
Author: Joe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-24 23:43:43

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

  • fread se bloquea hasta que se ha leído el número de bytes que ha solicitado, o el archivo termina, o se produce un error.
  • read también bloquea, pero si pide por ejemplo 4kB puede volver después de leer solo 1kB, incluso si el archivo no ha terminado.

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

 1
Author: Tor Klingberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-08 17:12:11