Directory

目前目錄被刪除時會發生什麼?

  • April 27, 2021

在第一個終端A中,我創建一個目錄,進入該目錄,並創建一個文件:

$ mkdir test
$ cd test
$ touch file1.txt
$ ls
file1.txt

然後在另一個終端 B 中,我刪除了目錄:

$ rm -r test
$ mkdir test
$ cd test
$ touch file2.txt

再回到終端 A(不做任何事情cd),我嘗試列出文件:

$ ls

ls沒有看到任何東西,也沒有抱怨。

後台發生了什麼?怎麼ls看不出問題?是否有標準的、可移植的和/或推薦的方法來找出終端 A 中的某些問題?

pwd只是列印看似正確的目錄名稱。touch file3.txt說沒有沒有幫助的文件或目錄。只bash -c "pwd"給出了兩條長錯誤行,它們以某種方式給出了錯誤但不是真正的描述性,我不確定不同系統之間的可移植性(我在 Ubuntu 16.04 上)。cd .. && cd test解決了問題,但並沒有真正解釋發生了什麼。

怎麼ls看不出問題?

首先沒有“問題”。

終端 A 出現問題

沒有什麼不對的。對於打開未連結目錄的程序有定義的語義,就像對於打開未連結文件的程序有定義的語義一樣。兩者都是正常的事情。

有定義的語義用於取消連結引用某物的目錄條目(同時在某處打開該東西),然後通過連結到其他東西的原始名稱創建目錄條目:您現在有兩個這樣的東西,並引用打開的描述first 不訪問第二個,反之亦然。目錄和文件一樣都是如此。

程序可以通過以下方式對目錄進行打開文件描述:

  • 它是程序的工作目錄;
  • 它是程序的根目錄;
  • 它由呼叫opendir()庫函式的程序打開;或者
  • 它由呼叫open()庫函式的程序打開。

rmdir()允許無法刪除指向仍然打開的目錄的連結(這是一些舊Unices的行為,並且是一些非 Unix-non-Linux POSIX-conformant 系統的行為),並且如果仍然-打開的目錄通過以路徑名組件結尾的名稱取消連結.;但是如果它成功並刪除了到目錄的最終連結,則定義的語義是一個仍然打開但未連結的目錄:

  • 根本沒有目錄條目;
  • 此後不能創建任何目錄條目,即使嘗試程序具有寫訪問權或特權訪問權。

您的作業系統是在這些情況下不會返回的作業系統之一EBUSYrmdir()並且您在第一個終端會話中的 shell 有一個未連結但仍打開的目錄作為其目前目錄。你所看到的一切都是在那種情況下定義的行為。 ls,例如,顯示了您當時擁有的兩個目錄中的空的仍然打開的**第一個目錄。

甚至是的輸出pwd。當在該 shell 中作為內置命令執行時,該 shell 在內部跟踪 shell/環境變數中目前目錄的名稱。當在另一個 shell 中作為內置命令執行時,另一個 shell 未能將其工作目錄的設備和 i-node 編號與現在由它繼承的環境變數的內容命名的第二個目錄PWD匹配,從而決定不信任 的內容PWD然後getcwd()庫函式中失敗,因為工作目錄不再有任何名稱,它已被取消連結。

進一步閱讀

引用自:https://unix.stackexchange.com/questions/434417