似乎我无法在/ 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)
的简单方法来告诉内容大小,而不是自己读取所有内容并计算字节数。
答案 0 :(得分:1)
简短的回答是,由于它是一个特殊文件,因此您必须阅读文件才能知道内容的大小,如以下深入介绍:example
当程序要从文件中读取文件时,它将发出各种系统 库调用最终以一个形式出现在内核中 open(),read(),close()序列(可能带有for的seek() 好措施)。内核采用提供的路径和文件名,以及 通过文件系统和设备I / O层将这些转换为 物理读取请求(在许多情况下还会写入请求-考虑 例如一次更新)到一些基础存储。
但是,不必将这些请求专门翻译为 物理持久存储。内核的合同是签发 该特定的系统调用集将提供 有问题的文件。 “物理文件”在我们的物理领域中的确切位置 存在是次要的。