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.)
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.
Famille read()
-> open
, close
, read
, write
Famille fread()
-> fopen
, fclose
, fread
, fwrite
Plus de détails ici , mais notez que ce message contient des informations incorrectes.
read
est un appel système, tandis que fread
est une fonction de la bibliothèque standard C.
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.
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.