C言語

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

2021年12月31日

関数仕様

書式

 

引数

fd 書き込み先ファイルを指すファイルディスクリプタ(ファイル記述子)
buf 書き込むデータを格納しているバッファの先頭アドレス
count 書き込むバイト数

 

戻り値

0以上の値 書き込んだバイト数
-1 エラーが発生(errno にエラー番号がセットされています)

 

代表的なエラー(errno)

  • EAGAIN
    fd がソケットや PIPE 以外を指していて O_NONBLOCK が設定されており、
    書き込みを行うと停止する状況にある
  • EPIPE
    fd がソケットか PIPE に接続されており、その反対側(読み込み側)が既にクローズ(close)されている
    これが発生した場合は、書き込みを行なうプロセスは SIGPIPE シグナル (signal)も受ける
  • EINTR
    指定されたバイト数を書き込み完了するまでにシグナルに割り込まれた

 

機能

  • ファイル記述子 fd が示すファイルに、buf に格納されたのデータを最大 count バイト書き込みます
  • fd が seek に対応しているファイルを指している場合、write は現在のファイルオフセットから開始されます。ファイルオフセットは書き込んだバイト数分だけインクリメントされます
  • write は read とは異なり、戻り値が示す書き込んだバイト数が countで指定したバイト数よりも小さくなることは殆どありません

 

注意すること

注意ポイント

書き込んだ内容がすぐにディスク(HDD/SSD)や外部ストレージに反映されるわけではない

write で書き込んだ内容は、カーネルのバッファ(ディスクキャッシュ)へ 格納されます。
カーネルが暇な時に実際に書き込まれます。書き込んだ後に読み出しても、 参照先はカーネルのバッファになるため、実際に書き込まれたかどうかを 確認するのは困難です。
また、バッファにデータが滞留している間に電源を OFF にすると、ファイルが壊れます。

参考

ファイルの破損を防ぐ書き込み方は、「ファイル破損を防ぐ方法」にまとめています。

 

サンプル:エラーの対処と最後まで書き出す細工

 

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

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

SANACHAN

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

-C言語
-, ,