APUE 3rd、4.21でこの内容を読みました。リンク数がゼロに達したときに1つ以上のプロセスでディレクトリが開いている場合、関数が返される前に最後のリンクが削除され、ポイントエントリとポイントエントリが削除されます。私はこれを理解できません。 「リンク数が0に達しました」は「リンク数が2に達しました」と思いました。空のディレクトリには複数のリンクがあります。 rmdirがリンク計算をどのように処理するかを知りたいです。
ベストアンサー1
あなたは混乱しています。 rmdir
リンク数にはまったく気にしないでください。ロジックは非常に簡単です。
一度ファイルがリンク数0で実行中のプロセスに参照(ファイル記述子または現在のディレクトリ)がない場合は、実際に削除されます。これで、ディスク容量をさまざまな目的でリサイクルできます[*]。
ディレクトリはファイルです。ただし、リンクを解除(親ファイルから削除)するには、他の種類のファイルよりも多くの考慮事項が必要です。このディレクトリのすべてのサブディレクトリも切断されていることを確認する必要があります。そうしないと、サブリンクの数を更新する機会が失われる可能性があります。私たちはそのディスク容量を永久に失うでしょう。
したがって、私たちはユーザーがディレクトリを呼び出すことを許可しませんunlink
。代わりに、rmdir
2つの方法だけがrmdir
異なる特別な目的の.callを使用する必要があります。unlink
- ディレクトリは「空でなければなりません」。つまり、サブディレクトリには標準と
.
エントリ..
のみが必要です。 unlink
ディレクトリ自体で実行する前に、残りの2つのエントリが切断されていることを確認してください。
それはそれ。他の魔法はありません。 rmdir
1項の条件が満たされるまで延期されません。 rmdir
呼び出されると成功または失敗します。この条件は、いかなる方法でもリンク数に基づいていません。
.
特別なケースではありませんが、リンク数に対する項目の効果が興味深いと思います。これは親ディレクトリへのハードリンクなので、リンク数が増えます。これが、新しく作成されたディレクトリDIRのリンク数が2である理由です。後で呼び出すとrmdir DIR
リンクDIR/.
とが削除されるため、リンク数は0に戻りますDIR
。
Linuxでは、実際にはディレクトリ内でシェルを実行し、ディレクトリのls -ld
接続が解除された後(親ディレクトリから削除された)、それを実行して上記の内容を観察できます。
もちろんls -ld
略語ls -ld .
。ディレクトリエントリが削除された後も引き続き機能します.
。..
実際、最新のLinuxは実際にはこれらのディスク上のディレクトリエントリには依存しません。私は初期のUnix実装ですいいえこれをサポートしてください。ただし、参照カウントは上記のようにまだ機能し、ディレクトリを削除する特別なケースはないと思います。
(仕事を続ける方法は..
もっと興味深いです。以下のコメントで議論してください)。
実際、簡単に見ることができますrmdir
。特別な権限で実行されるユーザープログラムとして実装。歴史的なUnixコードはオンラインで簡単に見つけることができます。これが私がこれについてそう確信している理由の1つです。
df .
[*] したがって、使用されているディスクブロック(またはアノード)の違いを見ると、ファイルが削除されたことを確認できますdf -i .
。このアプローチは、Linuxなどのファイルシステムでうまく機能しますext4
。しかし、従来より少ないファイルシステムでは、最適化がより複雑になり、観察が難しい場合があります。