web-dev-qa-db-ja.com

read()とfread()の違いは何ですか?

Linuxツールのソースコードを読んでいます badblocks 。そこでread()関数を使用します。標準のC fread()関数と違いはありますか? (引数を違いとして数えていません。)

46
Georg Schölly

read()は低レベルのバッファなし読み取りです。 UNIX上で直接システムコールを行います。

fread()はCライブラリの一部であり、バッファ読み取りを提供します。通常、バッファを埋めるためにread()を呼び出すことで実装されます。

54
Darron

ファミリread()->openclosereadwrite
家族fread()->fopenfclosefreadfwrite

家族が読む:

  • システムコールです
  • フォーマットされていないIO:フォーマットされていないバイトストリームがあります

家族の恐怖

  • 標準Cライブラリ(libc)の関数です
  • 内部バッファーを使用する
  • それらのいくつかについてIO( "%.."パラメーターを使用))
  • 常にLinuxバッファキャッシュを使用する

詳細 here 。ただし、この投稿には誤った情報が含まれていることに注意してください。

36
AIB

readはsyscallですが、freadはC標準ライブラリの関数です。

8
phihag

私が覚えているように、read()レベルのAPIはバッファリングを行いません。したがって、read()を一度に1バイトずつ使用すると、fread()fread()はブロックをプルし、要求に応じてブロックを削除します。 read()は、呼び出しごとにカーネルにドロップします。

7
Joe

一方を使用するコードをもう一方を使用するコードに変換する場合に注意する必要がある1つの違い:

  • freadは、要求したバイト数が読み取られるか、ファイルが終了するか、エラーが発生するまでブロックします。
  • readもブロックしますが、たとえば4kBを要求すると、ファイルが終了していない場合でも、1kBだけを読み取った後に戻ることがあります。

これは、ファイルの保存場所、キャッシュなどに依存するため、微妙なバグを引き起こす可能性があります。

4
Tor Klingberg