Linux
一切都是文件?
在 Linux 中,每一個實體都被視為 FILE。如果我這樣做
vim <cd-Name>
,vim
會將目錄內容打開到它的編輯器中,因為它不區分文件和目錄。但是今天在工作的時候,遇到了一件很想知道的事情。
我打算從嵌套目錄中打開一個文件
vim a/b/c/d/file
vim
但我輸入的不是,而是cd a/b/c/d/
並點擊
TAB
兩次,但命令只顯示“d”目錄的可用目錄而不是文件。命令不
cd
尊重“一切都是文件”嗎?還是我錯過了什麼?
“一切都是文件”片語定義了作業系統的體系結構。這意味著系統中的所有內容,包括程序、文件、目錄、套接字、管道……都由核心中虛擬文件系統層抽象的文件描述符表示。虛擬文件系統是核心提供的介面。因此,該片語被更正為“一切都是文件描述符”。Linus Torvalds 自己再次更準確地糾正了它:“一切都是字節流”。
但是,每個“文件”還具有您可能從正常文件和目錄中知道的所有者和權限。因此,像 cat、ls、ps 等經典 Unix 工具可以查詢所有這些“文件”,並且不需要發明其他特殊機制,而不僅僅是使用
read()
系統呼叫的普通舊工具。例如,在 Microsoft 的作業系統系列中read()
,任何文件類型都有多個不同的系統呼叫(我聽說大約 15 個),而且每一個都有點不同。當一切都是文件時,您就不需要它了。對你的問題:當然有不同的文件類型。在 linux 中有7 種文件類型。目錄就是其中之一。但是,實用程序可以將它們彼此區分開來。例如,
cd
命令的完整功能(當您按 時TAB
)僅列出目錄,因為stat()
系統呼叫(請參閱man 2 stat
)返回一個帶有名為 的欄位的結構st_mode
。POSIX 標准定義了該欄位可以包含的內容:S_ISREG(m) is it a regular file? S_ISDIR(m) directory? S_ISCHR(m) character device? S_ISBLK(m) block device? S_ISFIFO(m) FIFO (named pipe)? S_ISLNK(m) symbolic link? (Not in POSIX.1-1996.) S_ISSOCK(m) socket? (Not in POSIX.1-1996.)
cd
命令完成功能只顯示S_ISDIR
設置標誌的“文件”。