Linux
cat
如何在沒有文件描述符的情況下讀取文件?
我正在學習 Linux
procfs
,它利用一個虛擬文件系統,其中像open
、read
、write
和之類的操作release
由註冊到它的函式處理。我錯誤地將
open
and保留release
為空指針,當我嘗試讀取文件的內容時,使用如下 Python 程式碼:with open("/proc/testfile", "r") as f: content = f.read()
程序卡住了,我從核心 dmesg 中讀取了空指針被取消引用的錯誤,這是預期的,因為
open
它指向 NULL。但是,
cat
來自 GNU coreutils 的命令可以完成這項工作,給我這樣的輸出$ cat /proc/testfile testoutput
這意味著
cat
沒有呼叫open
函式而是直接呼叫read
(write
也可以這樣做)。據我了解,
open()
將返回一個文件描述符,該描述符進一步用於處理文件,並且read()
需要一個文件描述符才能繼續。這是如何在裡面完成的
cat
?
您可以使用
strace
查看某個命令正在執行的系統呼叫:$ strace cat /proc/version [...] openat(AT_FDCWD, "/proc/version", O_RDONLY) = 3 [...] read(3, "Linux version 5.16.0-5-amd64 (de"..., 131072) = 181 write(1, "Linux version 5.16.0-5-amd64 (de"..., 181) = 181 [...]
$ strace python3 -c 'open("/proc/version")' [...] openat(AT_FDCWD, "/proc/version", O_RDONLY|O_CLOEXEC) = 3 [...]
Appart for that
O_CLOEXEC
flag 應該與您的問題沒有任何關係,兩者都在我的系統上進行完全相同的系統呼叫。