我正在学习 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
查看某个命令正在执行的系统调用:Appart for that
O_CLOEXEC
flag 应该与您的问题没有任何关系,两者都在我的系统上进行完全相同的系统调用。