为什么位置/ proc / <pid> / <files>上的stat(2)始终为空

时间:2019-11-18 17:39:07

标签: c linux

似乎我无法在/ 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这是故意的吗? 2在这种情况下,是否有一种类似于stat(2)的简单方法来告诉内容大小,而不是自己读取所有内容并计算字节数。

1 个答案:

答案 0 :(得分:1)

简短的回答是,由于它是一个特殊文件,因此您必须阅读文件才能知道内容的大小,如以下深入介绍:example

  

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

     

但是,不必将这些请求专门翻译为   物理持久存储。内核的合同是签发   该特定的系统调用集将提供   有问题的文件。 “物理文件”在我们的物理领域中的确切位置   存在是次要的。