Linuxツールのソースコードを読んでいます badblocks 。そこでread()
関数を使用します。標準のC fread()
関数と違いはありますか? (引数を違いとして数えていません。)
read()
は低レベルのバッファなし読み取りです。 UNIX上で直接システムコールを行います。
fread()
はCライブラリの一部であり、バッファ読み取りを提供します。通常、バッファを埋めるためにread()
を呼び出すことで実装されます。
ファミリread()
->open
、close
、read
、write
家族fread()
->fopen
、fclose
、fread
、fwrite
詳細 here 。ただし、この投稿には誤った情報が含まれていることに注意してください。
read
はsyscallですが、fread
はC標準ライブラリの関数です。
私が覚えているように、read()
レベルのAPIはバッファリングを行いません。したがって、read()
を一度に1バイトずつ使用すると、fread()
。 fread()
はブロックをプルし、要求に応じてブロックを削除します。 read()
は、呼び出しごとにカーネルにドロップします。
一方を使用するコードをもう一方を使用するコードに変換する場合に注意する必要がある1つの違い:
fread
は、要求したバイト数が読み取られるか、ファイルが終了するか、エラーが発生するまでブロックします。read
もブロックしますが、たとえば4kBを要求すると、ファイルが終了していない場合でも、1kBだけを読み取った後に戻ることがあります。これは、ファイルの保存場所、キャッシュなどに依存するため、微妙なバグを引き起こす可能性があります。