c - sirve - php fopen fgets
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 here , aunque tenga en cuenta que esta publicación contiene información incorrecta.
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 pides decir 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.
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.
read
es un syscall, mientras que fread
es una función en la biblioteca estándar de C.