2013-03-21 30 views
5

open()関数の結果で正の値に設定されたファイル記述子を持っています。私が実際のファイルを削除すると、fdはまだ正の整数です。私は何らかの理由でファイルを削除すると、このファイル記述子がもう有効ではないことを知ることができます。要するに、fdが示しているファイルが、そこに存在するかどうかを知ることができます。私はFreeBSDのCでこれをやろうとしています。ファイル記述子を使用してファイルがまだ存在するかどうかを確認する方法

+0

ファイルへの書き込みまたは読み取りを試みます。それはエラーを返します。 – RedX

+2

@RedXこれはUNIXの仕組みではありません。 – LtWorf

+0

はい、私はそのファイルを読んだり開いたりする必要があることを知っていますが、fdだけでファイルを開いたり読んだりする方法はありますか? fd、path、またはFILEだけで読み込みまたは開くためのio関数があります。* –

答えて

4

UNIXシステムでは、開いているファイルを削除することができます(または、ファイルシステムからファイルへのすべての参照を削除することができます)。しかし、ファイル記述子はでも有効です。です。読み込みと書き込みの呼び出しは、そこにファイル名が残っているので、成功します。

つまり、ファイルディスクリプタが閉じられるまで、ファイルを完全に削除することはできません。クローズすると、ファイルは自動的に削除されます。

有効なファイル記述子を使用すると、ファイル名がまだ存在するかどうかを確認できます。 buffstatで初期化struct statある

printf("%d\n", buf.st_nlink); // 0 means no filenames 

+0

アドバイスありがとうございますが、これは私が直面している別の状況です。 fdがまだそこにあるかどうかを確認する必要があります。 fdを介してそれを学ぶ方法は何ですか? –

+1

@HasanBozok - 有効なファイル記述子で 'fstat'を使用すると、ハードリンクの数を取得できます。 0の場合、ファイル名は削除されています。 – teppic

+0

@teppic、['ioctl'](http://pubs.opengroup.org/onlinepubs/009696699/functions/ioctl.html)を使ってファイルを実際に削除する方法はありますか?それが可能なら、それは危険でしょうか? –

1

ファイルに書き込む前に、それはまだそこaccess()あなたはまた、ディスクリプタにfstat情報行うことができ

if (access("/yourfile",W_OK)!=-1) { 
    //Write on the file 
} 

使用している場合は、チェックすることができ:

struct stat statbuf; 
fstat(fd,&statbuf); 
if (statbuf.st_nlink > 0) { 
    //File still exists 
} 

をしかし、それはあなたのソフトウェアが遅くなりますいくつかのプログラムは、ファイルを別の場所にリンクして元の名前をリンク解除することができます。その結果、ファイルはまだ存在しますが、別の名前/場所の下にあります。

もっと良い選択肢は、GNU/Linux上でinotify、またはbsd上でkqueueを使用することですが、私は2番目を使用したことはありません。

これらのAPIを使用して、ディレクトリの変更を監視したり、カーネルから通知を受け取ったり、ファイルが他のプロセスによって削除されたときにイベントを取得したりできます。

このイベントはリアルタイムではありませんので、イベントを取得する前に数ミリ秒間ファイルを使用することができます。

関連する問題