Linux

cat 如何在沒有文件描述符的情況下讀取文件?

  • April 3, 2022

我正在學習 Linux procfs,它利用一個虛擬文件系統,其中像openreadwrite和之類的操作release由註冊到它的函式處理。

我錯誤地將openand保留release為空指針,當我嘗試讀取文件的內容時,使用如下 Python 程式碼:

with open("/proc/testfile", "r") as f:
   content = f.read()

程序卡住了,我從核心 dmesg 中讀取了空指針被取消引用的錯誤,這是預期的,因為open它指向 NULL。

但是,cat來自 GNU coreutils 的命令可以完成這項工作,給我這樣的輸出

$ cat /proc/testfile
testoutput

這意味著cat沒有呼叫open函式而是直接呼叫readwrite也可以這樣做)。

據我了解,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_CLOEXECflag 應該與您的問題沒有任何關係,兩者都在我的系統上進行完全相同的系統呼叫。

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