回答受付が終了しました

linux fopenでファイルディスクリプタ保持中にファイルが削除されたとき

Linux系 | C言語関連19閲覧

回答(4件)

0

Linuxではファイル削除は直ちに消すわけじゃありません。 誰かが消しても使っているファイルはそのままで、ディレクトリーツリーから消えるだけです。ですからfwriteやfreadも従来通り動作します。 その状態で同じファイル名でファイルをcreate openした場合当然作られますが前のファイルと別のファイルができます。 cの関数で tmpfile() と言うのがありますがそれを使うと名前のないファイルができます。pipe() も同様に名前のないファイルができます。使っているファイルを消すとそんな状態になります。

0

OSの実装にもよりますが、 だれかがOPENしている状態で、 別の誰かが、そのファイルを削除した場合、 見た目上は消えますが、実際には、まだファイルは削除されていなくて、 一人目がCLOSEしたタイミングで、ファイルが消えて、領域が解放される という造りだと思います。 昔、 自分でファイルを作成(WRITEでOPEN)して、 OPENしたまま、わざと、自分でファイルを削除(UNLINK)して、 で、そのファイルを使って、 で、最後にファイルをCLOSEする という小技があったような気がします。 確か、ディスクを一時的な領域として使用するような使い方で、UNLINKしても、そのまま使い続けられる。かつ、削除忘れを防止するため。みたいな小技だったと思います。 削除じゃなくて、更新されたときも、もとの情報を持っていて、とか、そんな感じだったような気がします。 違ってたら、すみません。

0

試してみたらどうですか? USBメモリー中のファイルを読み込み、書き込みモードでオープンし、そのままUSBを抜いて、それでfwrite、freadしてみるだけです。 fopen後にキー入力待ちにしておいて、その間にUSB抜けば簡単に再現できますよ。 この程度でリセットが起きるとしたら、環境に問題があると思います。