0

ファイルを削除 (ゴミ箱) する方法について当惑していますが、プロセスによってリンクされていて、まだ書き込まれています。私の理解では、ファイル名は i ノードを指すディレクトリ内のエントリです。inode は、ファイルを構成する論理ブロックをリストするデータ構造です。ファイルが削除されると、そのディレクトリ エントリは削除されますが、データと inode は変更されません。カーネルは i ノードへの他のリンクがあるかどうかを確認し、存在しない場合は i ノードが削除され、メモリが再利用されます。しかし、このような名前のないファイルはどのようにして作成されるのでしょうか? ファイルを開いてPythonで読み書きすると、ファイルはディスク上に存在します。しかし、Mac でこのコマンドを発行すると、次のようになります。

lsof +L1

300個のファイルのリストを取得します! 私が読んだところによると、これらはリンクが 1 つしかないファイルであり、それらに書き込むプロセスへのリンクです。これらのファイルのディレクトリ エントリもある場合は、少なくとも 2 つのリンクがあります。では、途中のどこかで、これらのファイルに書き込んでいるプロセスがディレクトリ エントリを削除したのでしょうか。なんで?どのように?

4

2 に答える 2

2

ファイルを開き、リンクを解除します。これで、ディレクトリ内にリンクのないファイルへのオープン ファイル記述子ができました。

unlink()ファイルのリンク解除は、システム コールを使用してプログラムで実行できます。コマンド ラインから、コマンドrmまたはコマンドunlinkを使用できます。unlink()これらは事実上、システム コールを呼び出す手段にすぎません。

おそらくlsof、いくつかのプログラムがファイルを開き、別のプログラムがそのファイルを置き換えたため、あなたが来たことを示す多くのそのようなファイル記述子があります。ファイルを書き出す方法はいくつかあります。既存のファイルを開き、その内容を切り詰めてから、新しい内容を書き込むことができます。ファイルのリンクを解除してから、新しいファイルを開いて作成し、新しいコンテンツを書き込むことができます。または、別のファイルに書き込み、2 つのディレクトリ エントリをアトミックにスワップして新しいファイルを古いファイルの場所に配置し、古いファイルのリンクを解除します (つまり、rename()またはexchangedata()システム コールを使用)。後者の 2 つの方法では、ディレクトリからリンクされていなくても、既に開いているファイル記述子が古いファイルの inode を指しているままになります。

たとえば、私のシステムでlsofは、/private/var/folders/.../mds/mdsDirectory.db に対して開かれている多くの記述子が表示されます。これはおそらく Spotlight に関連しています。ディスク上にそのファイルのバージョンがありますが、同じ inode ではありません。したがって、おそらく何かが時刻 t0 にそれを開き、時刻 t1 に別の誰かが新しいバージョンを書き出して古いバージョンのリンクを解除し、時刻 t2 にチェックしました。

于 2014-10-05T03:58:50.630 に答える
1

これはあなたが興味を持っているものだと思います:

https://docs.python.org/2/library/os.html#os.tmpfile

ファイルには関連付けられたディレクトリ エントリがなく、ファイルのファイル記述子がなくなると自動的に削除されます。

于 2014-10-05T04:29:42.720 に答える