web-dev-qa-db-fra.com

Quelle est la différence entre read () et fread ()?

Je lis le code source de l'outil Linux badblocks . Ils y utilisent la fonction read(). Existe-t-il une différence avec la fonction C fread() standard? (Je ne compte pas les arguments comme une différence.)

46
Georg Schölly

read() est une lecture de bas niveau, sans tampon. Il effectue un appel système direct sur UNIX.

fread() fait partie de la bibliothèque C et fournit des lectures tamponnées. Il est généralement implémenté en appelant read() afin de remplir son tampon.

54
Darron

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

Lire en famille:

  • sont des appels système
  • ne sont pas formatés IO: nous avons un flux d'octets non formaté

Effroi familial

  • sont des fonctions de la bibliothèque C standard (libc)
  • utiliser un tampon interne
  • sont formatés IO (avec le paramètre "% ..") pour certains d'entre eux
  • utilisez toujours le cache du tampon Linux

Plus de détails ici , mais notez que ce message contient des informations incorrectes.

36
AIB

read est un appel système, tandis que fread est une fonction de la bibliothèque standard C.

8
phihag

Si je me souviens bien, les API de niveau read() ne font pas de mise en mémoire tampon - donc si vous read() 1 octet à la fois, vous aurez une énorme pénalité de perf par rapport à faire la même chose avec fread(). fread() tirera un bloc et le distribuera comme vous le demandez. read() tombera dans le noyau pour chaque appel.

7
Joe

Une différence que vous devez savoir si vous convertissez du code qui utilise l'un pour utiliser l'autre:

  • fread bloque jusqu'à ce que le nombre d'octets que vous avez demandé ait été lu, que le fichier se termine ou qu'une erreur se produise.
  • read bloque également, mais si vous demandez par exemple 4 Ko, il peut revenir après avoir lu seulement 1 Ko, même si le fichier n'est pas terminé.

Cela peut provoquer des bogues subtils, car cela dépend de l'endroit où le fichier est stocké, des caches, etc.

4
Tor Klingberg