首页 > 解决方案 > 为什么 stat(2) 在位置 /proc//总是给出一个空大小

问题描述

似乎我无法在 /proc 下的(伪)stat(2)文件fstat(2)上进行转换以获取它的大小。

file: test.c
#include <unistd.h>
#include <sys/stat.h>
#include <stdio.h>
int main(int argc, char **argv) 
{
    struct stat st;
    stat(argv[1],&st);
    printf("%d\n",st.st_size);  
}

编译它cc test.c

$./a.out /etc/passwd
2495
$./a.out /proc/self/environ
0
$./a.out /proc/self/maps
0
$ stat /proc/self/environ
<some output> 
Size: 0             Blocks: 0          IO Block: 1024   regular empty file
<some output>
$ file /proc/self/cmdline 
/proc/self/cmdline: empty

read(2)fread(3)可以成功获取内容。但是,lseek(2),lseek(fd,0,SEEK_END)无效;

我的问题:

1 是故意的吗?stat(2)2在这种情况下,除了读取所有内容并自己计算字节数之外,是否有一种类似于告诉内容大小的简单方法。

标签: clinux

解决方案


简短的回答是,您必须阅读文件才能知道内容的大小,因为它是一个特殊文件,如此处深入介绍:https ://superuser.com/questions/619955/how-does-proc-工作/

当一个程序想要从一个文件中读取时,它会发出各种系统库调用,最终以 open()、read()、close() 序列的形式进入内核(可能带有 seek()好措施)。内核采用提供的路径和文件名,并通过文件系统和设备 I/O 层将这些转换为物理读取请求(并且在许多情况下还写入请求——例如 atime 更新)到一些底层存储。

但是,它不必将这些请求专门转换为物理的持久存储。内核的约定是发出特定的系统调用集将提供相关文件的内容。在我们的物理领域中,“文件”的确切存在位置是次要的。


推荐阅读