我正在学习 Linux procfs
,它利用虚拟文件系统,其中open
、read
、write
、 和等操作release
由注册到其中的函数处理。
我错误地将open
andrelease
保留为空指针,当我尝试读取文件的内容时,使用如下 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
?
答案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
标志应该与您的问题没有任何关系,两者都在我的系统上进行完全相同的系统调用。