“cat”如何在没有文件描述符的情况下读取文件?

“cat”如何在没有文件描述符的情况下读取文件?

我正在学习 Linux procfs,它利用虚拟文件系统,其中openreadwrite、 和等操作release由注册到其中的函数处理。

我错误地将openandrelease保留为空指针,当我尝试读取文件的内容时,使用如下 Python 代码:

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

程序卡住了,我从内核 dmesg 中读取到空指针被取消引用的错误,这是预期的,因为它open指向 NULL。

然而,catGNU coreutils 的命令可以完成这项工作,给我输出如下

$ cat /proc/testfile
testoutput

这意味着cat没有调用该open函数而是直接调用readwrite也可以这样做)。

根据我的理解,open()将返回一个文件描述符,该文件描述符进一步用于处理文件,并且read()需要文件描述符才能继续。

这在里面是怎么做到的cat

答案1

您可以使用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 对于该O_CLOEXEC标志应该与您的问题没有任何关系,两者都在我的系统上进行完全相同的系统调用。

相关内容