回答:
まずいないすべてのファイルシステムが使用.
し、..
ハードリンクなど。これはgnu findマニュアルに記載されています。それらのファイルシステムはunix向けに設計されておらず、明快さを追加せずに物事を複雑にするだけなので、残りの回答では無視します。同じ理由で、ルートディレクトリとマウントポイントも無視します。
.
およびのため、ディレクトリへのリンクの数は2より少なくなることはありません..
。サブディレクトリの数は、リンクの数から2を引いた数に等しくなります。このため、あなたは、リンクやディレクトリのリンクを解除、そうすることはできませんrm -r
でしょうstat
削除し、使用する前に、ファイルrmdir
の代わりにunlink
ディレクトリのでは。2つのシステムコールは、カーネルで完全に異なるコードパスを使用します。
..
各ディレクトリに存在しているサブディレクトリ。これはすべて/
1つだけなので、すべてのディレクトリです。
..
それ自体へのハードリンクがありません。ディレクトリへのハードリンクは何ですか?パス名を持つファイル、および.
?(2)なぜマウントポイントを無視するのですか?
..
は親を指します。特殊なケースとして、ルートディレクトリリンクはそれ自体を指します。これによりcd ..\..
、どこにいても同様のコマンドが期待どおりに機能するようになります。stat
コマンドでテストできます。
..
。それ.
は、それを指す親ディレクトリ内の名前のためです。唯一の例外は、親を持たないルートです。しかし、それはしている..
、それはまた、リンク数= 2持っているので、自分自身を指す
参照カウント(たとえば、ハードリンクカウントと開いているファイルハンドルの数* の合計)が0に達する、従来の設計のUNIXファイルシステム上のファイルはすべて削除されます。ただし、最近のUNIXシステムでは、rmdir
システムコールは空のディレクトリ.
を..
1つずつ削除するのではなく、1回の操作で削除します。
ただし、歴史的なUNIXシステムでは、このシステムコールは存在しませんでした。代わりに、rmdir
コマンドはsetuidプログラム(ソースコードはここにあります)であり、ディレクトリが空であること(特別なエントリ以外)をチェックし、次に削除..
し.
、次にその順序で削除し、さらにディレクトリ自体を削除しました。unlink
rootのみがディレクトリでの使用を許可されたシステムコール(そのため、コマンドがsetuidされた理由)。したがって、これらのシステムでは、.
削除された後、ディレクトリが親ディレクトリから削除される前に、ディレクトリのリンク数は一時的に1になります。その後、0になります。
rm
ちなみに、このコマンドはrootでさえディレクトリを削除できませんでした。そして、その内容を空にした後、ディレクトリを削除rm -r
するrmdir
コマンドを呼び出します。
これらの歴史的なシステムでは、unlink
ルートとして実行されているプログラムからの呼び出しを誤用しrmdir
たりmv
、またはで競合状態になったり、現在のディレクトリが削除されているプロセスでファイルを作成したりすると(最新のシステムではこれを防止)、ファイルまたはディレクトリがぶら下がる可能性がありますハードリンク数が0を超えているが、ディレクトリツリーには存在しない。この状態はによって検出されましたがdcheck
、fsck
ほとんどのファイルシステムで物理的に可能であるため、依然としてチェックインの1つです。
ちなみに、ファイルシステムは、ハードリンクを持つ通常のファイルとしてディレクトリ(.
およびを含む..
)を実装する必要はありません。これらのファイルシステムでは、ディレクトリのハードリンク数は常に次のように報告されます0
(もちろん、親ディレクトリ内のその存在は「参照カウント」1に該当します)。
削除されたディレクトリの動作(たとえば、すでに開いているか、現在のディレクトリとして持っているプロセスで調べた場合)と、ディレクトリの「リンク数」の正確な意味は規定されていません。たとえばMac OS Xでは、実際のハードリンクはありませんが、ハードリンク数は2と報告されます。にもかかわらず、.
および..
リストには表示されません、ディレクトリを開くことができ、stat
名前で呼ばれることも.
か..
。Linuxでは、リンク数は0ですが.
、..
同様に機能します。
Mac OS X は、サブディレクトリの数だけでなく、ディレクトリ内のすべてのファイルの数をリンク数として報告します。しかし、それは場合でも、2である.
と..
なくなっています。
*これには、通常のオープン記述子、メモリマップセクション(バイナリの実行や共有ライブラリなど)、および現在のディレクトリの処理が含まれます。
strcpy
setuid実行可能ファイルの固定サイズ配列に...これらは良い時でした!
mkdir
同じことを逆に行わなければならないという事実に基づいて、実際に公開されたエクスプロイトがあります。
rmdir
、removin ..
は親ディレクトリを削除しませんか?
..
があります。サブディレクトリがある場合のみですよね?それで..
、常にディレクトリに存在するとは限りませんよね?