C言語関係掲示板

過去ログ

No.350.ファイルオープン中にそのファイルを削除した場合

[戻る] [ホームページ]
No.2255

ファイルオープン(fopen)中にそのファイルを削除した場合
投稿者---はる(2002/07/31 22:34:03)


2日連続しての投稿になります。(^^;
プログラムの中で、あるファイルをfopenでを開き、
fcloseするまでの間にそのファイルを削除した場合、
ファイルがなくなったことを検出できるのでしょうか?
(何かの関数がエラーを返すとか?)

当方、Linuxでの開発ですが、プログラムが
ファイルオープン中に、そのファイルをrmで削除し、
そのあとfprintで出力処理を行ってもプログラムは普通に終了します。
無くなったファイルに対して出力処理を行っている
ようですが、どこに出力されてしまったのでしょうか?
ご存知の方、宜しくお願いします。


No.2258

Re:ファイルオープン(fopen)中にそのファイルを削除した場合
投稿者---かずま(2002/08/01 03:35:59)


> 当方、Linuxでの開発ですが、プログラムが
> ファイルオープン中に、そのファイルをrmで削除し、
> そのあとfprintで出力処理を行ってもプログラムは普通に終了します。
> 無くなったファイルに対して出力処理を行っている
> ようですが、どこに出力されてしまったのでしょうか?

Unix のファイルは、オープン中に削除しても、ディレクトリからファイル名が
削除されるだけで、ファイルの実体は削除されません。
ファイルの実体は inode で管理されますが、ファイル名の削除によって、
inode の中にあるリンクカウントが 1つ減ります。普通はそれがゼロになると、
ファイルの実体も削除されるのですが、オープンされている場合、実体は
削除されません。そのファイルの実体をオープンしているプロセスによって
読み書きが出来ます。
ファイルをクローズすると、オープンカウントが 1つ減ります。
オープンカウントがゼロになったとき、リンクカウントがゼロだと、
ファイルの実体が削除されます。

inode 番号は、ls -i で表示されます。
リンクカウントは、ls -l で表示されます。
リンクカウントを増やすのは、ln file1 file2 ですね。
この場合、file1 と file2 は同じ inode番号に対応付けられ、ファイルの
実体はひとつで、リンクカウントは 2 です。
rm file1 を実行しても、リンクカウントが 1 になるだけで、ファイルの実体は
削除されません。


> プログラムの中で、あるファイルをfopenでを開き、
> fcloseするまでの間にそのファイルを削除した場合、
> ファイルがなくなったことを検出できるのでしょうか?
> (何かの関数がエラーを返すとか?)

ファイル名がなくなったときに、通知がくるわけではありませんが、
fstat() でリンクカウントを調べると、そのファイルの実体を参照する
ファイル名がいくつあるかは分かります。
fopen() したときのファイル名があるかどうかは、access() でわかるでしょう。
もう一度 open() してみてもよいでしょう。

No.2278

Re:ファイルオープン(fopen)中にそのファイルを削除した場合
投稿者---はる(2002/08/02 19:43:30)


かずまさん、ありがとうございました。
勉強になりました!!