C言語

【C言語】read関数の使い方、間違っていませんか?

関数仕様

書式

 

引数

fd 読み出すデータが格納されているファイルディスクリプタ(ファイル記述子)
buf 読み出したデータを格納するバッファの先頭アドレス
count 読み込む最大バイト数

 

戻り値

正の値 読み込んだバイト数
0 ファイルオフセットが既にEOF
-1 エラーが発生 (errno にエラー番号がセットされています)

 

代表的なエラー (errno)

  • EAGAIN
    fd がソケットや PIPE 以外を指していて O_NONBLOCK が設定されており、読み込みを行うと停止する状態にある
  • EBADF
    fd が有効なファイルディスクリプターでないか、読み込みのために オープン (open) されていない
  • EINTR
    指定されたバイト数を読み込み完了するまでにシグナルに割り込まれた

 

機能

  • ファイルディスクリプター fd から最大 count バイトをアドレス buf で始まるバッファーへ読み込む
  • fd が seek に対応しているファイルを指している場合、read は現在のファイルオフセットから開始される。ファイルオフセットは読み込んだバイト数分だけインクリメントされる
  • 現在のファイルオフセットがファイル末尾の場合は、読み出しは行われず 0 を返す
  • countSSIZE_MAX より大きい場合、動作は保証されない

 

注意すること

注意ポイント①

read 関数は、引数 count で指定したバイト数を必ず読み込んでくれるわけではない。

例えば、read 処理中に signal などの割り込みが発生した場合、 read は途中で中断されます。
これらのケアを正しく行わないと、中途半端なデータを処理してしまってプログラムが破綻してしまう

 

注意ポイント②

ソケットなどにアクセスする場合は、届いているデータを最後まで読み出す必要があります。

カーネル側のバッファが溢れ、書き込む側でエラーが発生します。

 

サンプル:エラーの対処と最後まで読みだす細工

SANACHAN
SANACHAN
システムコールの read() 関数をラップする my_read() という関数を用意して内部処理を記述します。

 

こちらの記事もよく読まれています

  • この記事を書いた人
  • 最新記事
SANACHAN

SANACHAN

「生涯一エンジニア」を掲げ、大手グローバル企業でSE/PGとして8年勤め、キャリアアップ転職した現役のエンジニアです。世にあるメジャーな全プログラム言語(コボル除く)を自由に扱えます。一児の父。自分のため、家族のため、日々勉強してます。システムエンジニア、プログラミングに関する情報を蓄積している雑記帳です。

-C言語
-,