open() 関数の結果で正の値に設定されたファイル記述子があるため、この fd はファイルを示しています。実際のファイルを削除しても、fd は正の整数のままです。何らかの理由でファイルを削除した場合、このファイル記述子が無効になったことをどうやって知ることができるか知りたいです。要するに、 fd が示しているファイルがまだ存在するかどうかをどのように知ることができますか。FreeBSDのCでこれをやろうとしています。
2 に答える
Unix システムでは、開いているファイルを削除できます (または、ファイル システムからファイルへのすべての参照を削除できます)。しかし、ファイル記述子はまだ有効です。ファイル名がまだそこにある場合と同様に、読み取りおよび書き込みの呼び出しはすべて成功します。
つまり、ファイル記述子が閉じられるまで、ファイルを完全に削除することはできません。閉じると、ファイルは自動的に削除されます。
有効なファイル記述子を使用すると、ファイル名がまだ存在するかどうかを確認できます。
printf("%d\n", buf.st_nlink); // 0 means no filenames
で初期化されbuf
た a はどこにありますか。struct stat
fstat
ファイルに書き込む前に、ファイルがまだそこにあるかどうかを確認できますaccess()
if (access("/yourfile",W_OK)!=-1) {
//Write on the file
}
記述子で fstat を実行することもできます。
struct stat statbuf;
fstat(fd,&statbuf);
if (statbuf.st_nlink > 0) {
//File still exists
}
ただし、ソフトウェアの速度が大幅に低下します。また、一部のプログラムがファイルを別の場所にリンクして元の名前のリンクを解除する可能性があるため、ファイルはまだ存在しますが、別の名前/場所の下にあり、この方法ではそれが検出されません。
はるかに優れた代替手段はinotify
、GNU/Linux で使用するか、bsd で kqueue を使用することですが、2 番目のものは使用したことがありません。
これらの API を使用して、ディレクトリの変更を監視し、カーネルから通知を取得し、ファイルが他のプロセスによって削除されているときにイベントを取得し、それについて何かを行うことができます。
このイベントはリアルタイムではないため、イベントを取得する前に数ミリ秒間ファイルを使用できることに注意してください。