タイトルが示すように:
- 私のプログラムはファイルを開きます。
- 何かがやって来て、そのファイルを移動します。inode は同じはずですが、名前が異なります。
- ファイルを閉じてから削除しますが、もうありません
では、移動されたことを検出して正しいファイル名を削除するにはどうすればよいでしょうか?
何か案は?
inotifyを使用して、古い名前の変更を検出できます (IN_MOVE_SELF イベントを探します)。しかし、本当の目的が単にファイル名を削除することである場合は、ファイルを開いた直後に (unlink(2) を使用して) 削除することができます。Unix ファイル セマンティクスにより、開いているファイルを使い続けることができ、ディスク上のデータは、ハンドルが閉じられるまで実際には削除されません。そして、誰もファイルの名前を変更できなくなります。
fstat
開いているファイル、stat
名前、および結果を比較します。
しかし、考えられるすべてのチェックと同様に、それは依然として際どいものです。名前は、チェックを行った後でも、それに基づいて行動する前に意味が変わる場合があります。要件を再検討する時が来ました。
access(2)
ファイルを閉じる前に試してください。ENOENT が表示された場合、ファイルは移動されています。/proc/self/fd/$open_file_number/ シンボリック リンクをたどって、 を使用して新しいファイル名を見つけますreadlink(2)
。