在/proc
文件系统中,为什么有些文件的maps
文件是空的。是因为没有分配内存或数据不可用?
必须为它们分配一些内存,否则它们是如何运行的?
首先,请注意所有伪文件/proc/1234/maps
的/proc/self/maps
大小始终为零,正如stat(2)系统调用和ls
命令所报告的那样。但是,它们是顺序可读的(例如通过cat
命令,或使用read(2)系统调用,例如由 调用fgets
)。试一试cat /proc/self/maps
,ls -ls /proc/self/maps
例如。
文件大小为 0的一个可能原因/proc/*/maps
是计算它们的大小意味着计算它们的内容,这可能会很昂贵。所以内核更喜欢说 0 来表示它们的大小。把它们想象成某种管道。您需要按顺序阅读它们,它们不是lseek(2) -able。
阅读proc(5)手册页以了解有关/proc/
; /proc/1234
请注意,它使用的是 Unix 权限和所有权,因此如果 pid 1234 的进程不是您的,您将无法访问目录。
而且你可能还有一些僵尸进程。它们不再有任何地址空间,所以如果它们的maps
伪文件/proc
真的是空的(从某种意义上说,读取它会立即给出文件结束条件),甚至丢失,我不会感到惊讶。
请记住,/proc
在内核提供它们(并提供它们的数据)的意义上,下面的文件是伪文件,它们不涉及任何真正的磁盘 I/O。特别是,阅读它们应该很快。