目前目錄被刪除時會發生什麼?
在第一個終端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 系統的行為),並且如果仍然-打開的目錄通過以路徑名組件結尾的名稱取消連結.
;但是如果它成功並刪除了到目錄的最終連結,則定義的語義是一個仍然打開但未連結的目錄:
- 根本沒有目錄條目;
- 此後不能創建任何目錄條目,即使嘗試程序具有寫訪問權或特權訪問權。
您的作業系統是在這些情況下不會返回的作業系統之一
EBUSY
,rmdir()
並且您在第一個終端會話中的 shell 有一個未連結但仍打開的目錄作為其目前目錄。你所看到的一切都是在那種情況下定義的行為。ls
,例如,顯示了您當時擁有的兩個目錄中的空的仍然打開的**第一個目錄。甚至是的輸出
pwd
。當在該 shell 中作為內置命令執行時,該 shell 在內部跟踪 shell/環境變數中目前目錄的名稱。當在另一個 shell 中作為內置命令執行時,另一個 shell 未能將其工作目錄的設備和 i-node 編號與現在由它繼承的環境變數的內容命名的第二個目錄PWD
匹配,從而決定不信任 的內容PWD
,然後在getcwd()
庫函式中失敗,因為工作目錄不再有任何名稱,它已被取消連結。進一步閱讀
rmdir()
. “系統介面”。 開放組基本規範。IEEE 1003.1:2017。- https://unix.stackexchange.com/a/413225/5132
- 為什麼我不能刪除“。” 目錄?
- ‘rm .*’ 是否會刪除父目錄?