Was ist der Unterschied zwischen read() und fread()?

Lesezeit: 3 Minuten

Benutzeravatar von Georg Schölly
Georg Scholly

Ich lese den Quellcode des Linux-Tools schlechte Blöcke. Sie benutzen die read() funktionieren dort. Gibt es einen Unterschied zum Standard C fread() Funktion? (Ich zähle die Argumente nicht als Unterschied.)

Darrons Benutzeravatar
Darron

read() ist ein ungepufferter Lesevorgang auf niedrigem Niveau. Es führt einen direkten Systemaufruf unter UNIX durch.

fread() ist Teil der C-Bibliothek und bietet gepufferte Lesevorgänge. Es wird normalerweise durch Aufrufen implementiert read() um seinen Puffer zu füllen.

  • Es gibt also 3 Puffer? Die Festplatte hat eine, /dev/hda ist auch gepuffert und fread. Ist das richtig?

    – Georg Scholly

    24. Februar 2009 um 23:52 Uhr

  • Jawohl. Den dritten können Sie mit “fflush” leeren, den zweiten mit fsync. Ich kenne keine Möglichkeit, den Festplattenpuffer zu leeren.

    – Johannes Schaub – litb

    25. Februar 2009 um 0:16 Uhr

  • fflush() gilt nur für fwrite(), das dieselbe Beziehung zu write() hat wie fread() zu read().

    – Daron

    25. Februar 2009 um 11:50 Uhr

  • @ Darron, ich bin eher ein Linux-Typ und die Frage bezog sich auf Linux. Es kann je nach Betriebssystem unterschiedlich sein, aber im Allgemeinen kann man davon ausgehen, dass unter Linux Fread-Aufrufe gelesen werden.

    – Janis Gruzis

    30. Juni 2016 um 11:38 Uhr

Benutzeravatar von AIB
AIB

Familie read() -> open, close, read, write

Familie fread() -> fopen, fclose, fread, fwrite

Familie gelesen:

  • sind Systemaufrufe
  • sind nicht formatiert IO: Wir haben einen nicht formatierten Bytestrom

Familienangst

  • sind Funktionen der Standard-C-Bibliothek (libc)
  • Verwenden Sie einen internen Puffer
  • sind für einige von ihnen als IO (mit dem Parameter “%..”) formatiert
  • Verwenden Sie immer den Linux-Puffercache

Mehr Details hierbeachten Sie jedoch, dass dieser Beitrag einige falsche Informationen enthält.

  • Die letzten beiden Aufzählungspunkte sowohl in der Lese- als auch in der Fread-Liste sind Unsinn. Beide Familien verwenden standardmäßig den Buffer-Cache und welche man verwenden muss nichts damit zu tun, ob Sie auf ein Zeichengerät, ein Blockgerät oder eine normale Datei zugreifen.

    – Markus

    17. Dezember 2015 um 15:47 Uhr


  • AIB verwechselt zwei Ebenen der Pufferung – die Kernel-Pufferung findet in beiden Fällen statt (was ich normalerweise den Linux-Puffer-Cache nennen würde), aber die Pufferung, die im Userspace durchgeführt wird, um die Gesamtzahl der Systemaufrufe zu reduzieren, passiert meiner Meinung nach nur mit fread.

    – Josef Garwin

    15. Januar 2016 um 15:40 Uhr

  • @Marcus Ich habe die meisten Missverständnisse aus der Antwort entfernt.

    Benutzer149341

    8. März 2017 um 18:37 Uhr

Joes Benutzeravatar
Jo

So wie ich es in Erinnerung habe read() Level-APIs puffern nicht – wenn Sie also read() 1 Byte auf einmal haben Sie eine enorme Leistungseinbuße im Vergleich dazu, dasselbe zu tun fread(). fread() wird einen Block ziehen und ihn austeilen, wenn Sie danach fragen. read() wird bei jedem Aufruf an den Kernel übergeben.

read ist ein Systemaufruf, wohingegen fread ist eine Funktion in der C-Standardbibliothek.

Ein Unterschied, den Sie beachten sollten, wenn Sie Code konvertieren, der einen verwendet, um den anderen zu verwenden:

  • fread Blöcke, bis die angeforderte Anzahl von Bytes gelesen wurde oder die Datei endet oder ein Fehler auftritt.
  • read blockiert auch, aber wenn Sie beispielsweise nach 4 KB fragen, kann es nach dem Lesen von nur 1 KB zurückgegeben werden, selbst wenn die Datei noch nicht beendet ist.

Dies kann subtile Fehler verursachen, da es davon abhängt, wo die Datei gespeichert ist, Caches usw.

Benutzeravatar von Adrian Mole
Adrian Mol

read() –> Direkt mit diesem Systemaufruf an den Kernel, der die IO-Operation durchführt.

fread() –> Ist eine Funktion, die in der Standardbibliothek bereitgestellt wird.

Berufung fread() wird hauptsächlich für Binärdateidaten verwendet, in denen Strukturdaten gespeichert sind. Der Hauptunterschied zwischen diesen beiden ist die Anzahl der Systemaufrufe in Ihrer Anwendung.

Das fread() Eine Art Standard-IO-Bibliotheksfunktionen sind für Systemaufrufe optimiert, anstatt dass Ihre Anwendung Systemaufrufe durchführt.

1415320cookie-checkWas ist der Unterschied zwischen read() und fread()?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy