スーパーユーザーとして、Linuxで次のコマンドを実行しました
rm rm
それ自体を削除します。プロセスが実行中の場合、その参照カウントはゼロではないため、削除できません。だから私は困惑しています、どのように、そしてなぜそれが起こるのですか?
私も同じようにしてみchown 0000 chown
ました。
cp -r Dir1/ Dir2/
上記のコマンドでも、コピーが進行中のときにのみソースディレクトリを削除するとどうなりますか???
一時ファイルと同じです。
一時ファイルを作成する通常の方法は、ファイルをopen(2) (そのファイル記述子を保持) してからunlink(2) (ファイル記述子を開いたままで) であることを思い出してください。その後、プロセスが実行されていて、そのファイル記述子をclose(2) -d していない限り、ファイルのデータはファイル システムに残ります。
これは、ファイルが実際にはinodeであり、ディレクトリ内のファイル名ではないためです。(ディレクトリには、名前を inode に関連付けるエントリが含まれます)。
カーネルは一連の「使用済み」(または「開かれた」) i ノードを管理し、そのセットにはプロセスによって実行される i ノードが含まれます (実際には、 i ノードはmmap(2)やexecve(2 ) などのアドレス マッピングに関与します) 。
そのため、起動直後に/bin/rm /bin/rm
、カーネルはrm
プロセスの実行可能ファイルとしてバイナリへの参照を 1 つ持ちます。
syscall を処理するとき、unlink
一時的に 2 つの参照 (1 つは実行中のプロセス、もう 1 つはカーネル実装/bin/rm
に渡されたパスunlink
) を持ち、それを 1 つに減らします。
もちろん、タイピングは避けるべきですが、通常は、システムを修復できる/bin/rm /bin/rm
ようなスタンドアロン シェルがいくつかあります。sash
Windowsでは、あなたが言及した参照カウントのため、「rm rm」はおそらく不可能です。ただし、ほとんどの *nix システムではそうです。「rm」と「chmod」はメモリにロードされ、コマンドラインで指定されたものを実行します。別の例: あるウィンドウでファイルを編集し、そのファイルを編集中に別のウィンドウで削除します。これも、参照カウントに関係なく、ほとんどの *nix システムで可能です。
空になるまで rm を使用してディレクトリを削除することはできません..