ディレクトリへのハードリンク数が0になると、ディレクトリは削除されますか?

ディレクトリへのハードリンク数が0になると、ディレクトリは削除されますか?

ディレクトリへのハードリンク数が0になると、ディレクトリは削除されますか?

ディレクトリには常に少なくとも2つのハードリンクがあります.rm -rディレクトリの場合、ハードリンクの数を1ではなく2から0に減らしますか?

ディレクトリ内のハードリンクの数は1になりますか?

ありがとうございます。

答え1

伝統的に設計されたUNIXファイルシステムのすべてのファイル参照カウント(例:ハードリンク数の合計そして開いたファイルハンドルは、数字*)が0に達すると削除されます。ただし、最新のUNIXシステムでは、システムコールは1つずつ単一のrmdir操作で空のディレクトリを削除します...

ただし、過去のUNIXシステムでは、このシステムコールは存在しませんでした。逆に、rmdir 注文するsetuidプログラムです(ソースコードはここにあります。..)、ディレクトリが空であることを確認し(特殊項目を除く)、およびを順番に削除し、.ディレクトリ自体を削除します。すべてunlinkディレクトリにルートのみが許可されているというシステムコールを使用します(したがってコマンドがsetuidである理由)。 。したがって、これらのシステムでは、ディレクトリのリンク数が削除.されてから一時的に1になりますが、親ディレクトリからディレクトリが削除されるまでは0になります。

ただし、このrmコマンドはルートがディレクトリを削除するのを防ぎます。そして、ディレクトリの内容を消去してrm -rディレクトリを削除するコマンドを呼び出します。rmdir

unlinkこれらの履歴システムでは、rootとして実行されているプログラムへの呼び出しを誤って使用したり、rmdir競合状態が発生しmvたり、現在のディレクトリが削除されたプロセスからファイルを生成したりすると、ハングが発生する可能性があります(最新のシステムではこれを防ぎます)。ディレクトリ内のハードリンクの数がゼロより大きいが、ディレクトリツリーには存在しない。この状況は、ほとんどのファイルシステムで物理的にまだ可能であるため、によって検出され、スキャンのdcheck1つとして残ります。fsck


ところで、ファイルシステムは、ハードリンクを持つ通常のファイルとしてディレクトリ(.および含む)を実装する必要はありません。..これらのファイルシステムでは、ディレクトリ内のハードリンクの数は常に次のように報告されます0(もちろん、親ディレクトリに存在する場合は「参照数」1と一致します)。


削除されたディレクトリの動作(たとえば、そのディレクトリを開いたり、現在のディレクトリとして使用しているプロセスで調べるとき)とディレクトリの「リンク数」の正確な意味は指定されません。たとえば、Mac OS Xではハードリンク数を2と見てください、実際のハードリンクがなくても同じです。リストに.表示されない場合でも、ディレクトリを開くことも、名前を使用して呼び出すこともできます。 Linuxではリンク数は0ですが、まだ機能します。..stat......

Mac OS Xも報告します。すべてのファイルサブディレクトリの数だけでなく、ディレクトリのリンク数です。しかし、いつ.そして..消えても、それはまだ2です。


*ここには、一般的なオープンディスクリプタ、メモリマップの一部(実行可能なバイナリや共有ライブラリなど)、およびプロセス現在のディレクトリが含まれます。

答え2

まず、すべてのファイルシステムが.ハード..リンクとして使用するわけではありません。これはgnu findのマニュアルに文書化されています。残りの答えでは、これらのファイルシステムを無視します。これはUnix用には設計されておらず、明確性を追加せずに作業を複雑にするからです。同じ理由でルートディレクトリとマウントポイントも無視します。

.そして、ディレクトリへのリンク数は2つ未満ではありません..。サブディレクトリの数は、リンク数から2を引いたものと同じです。したがって、ディレクトリをリンクまたはリンク解除することはできず、ディレクトリより前のファイルを削除して使用することもできませんrm -r。これら2つのシステムコールはカーネルでまったく異なるコードパスを使用します。statrmdirunlink

関連情報