停電によって write() がハングした場合、ファイルの残りの部分はどうなりますか?

停電によって write() がハングした場合、ファイルの残りの部分はどうなりますか?

私は通常のファイル記述子でwrite(fd、buf、N)を呼び出しています。

呼び出し前のファイルポインタは、ファイルの先頭または終わりではなく、ファイルの中間のどこかにあります。

その後、停電により通話が中断されます(またはタスクが終了しました)。ファイル内のNバイト前後のデータに何が起こるかを保証できますか?変更されていないままであるという保証はありますか?

ベストアンサー1

2つの異なる問題があります。

  1. 書き込み中に電源が切れるとどうなりますか?

電源が切れると何が起こるのか保証できません。ファイルシステム全体が失われる可能性があります。

しかし、いくつかの典型的な行動があります。ファイルシステムが書き込み領域に新しいブロックを割り当てると、停電中に新しいブロックのファイルシステムメタデータが記録されず、ファイルが失われたり切れたりする可能性があります。ただし、ファイルの途中で書き込み中でブロックがすでに割り当てられている場合は問題はありませんが、ディスクへの書き込みがどれだけ行われるかを保証することはできません。一部でも全部でも全くないかもしれません。

コメントで指摘したように、CoWやネットワークファイルシステムなどの特殊ファイルシステムの動作は異なる場合があります。ジャーナリングファイルシステムは、これらの問題をよりシームレスに回復しようとします。また、RAIDアレイには、停電時に不完全な書き込みを保存するバッファリングハードウェアがあることがよくあります。

  1. 作成中にプロセスが終了するとどうなりますか?

これには2つの状況があります。 write(2) システムコールを参照する場合、これは主にアトミックであり、プロセスが実際に終了する前に完了するか、まったく開始されない可能性があります。場合によっては書き込みが中断される可能性がありますが、通常はそうではありません。

stdioバッファリングされたライブラリ呼び出し(fwrite(3)など)を使用したい場合は、プロセスが終了したときに書き込まれない、書き込まれていないバッファリングされたデータがプロセスに存在する可能性があります。通常、stdio はデータをチャンクとしてディスクにバッファリングします。バッファに完全なチャンクがある場合は、 write(2) を呼び出します。

おすすめ記事