c - 为什么 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在这种情况下,除了读取所有内容并自己计算字节数之外,是否有一种类似于告诉内容大小的简单方法。
解决方案
简短的回答是,您必须阅读文件才能知道内容的大小,因为它是一个特殊文件,如此处深入介绍:https ://superuser.com/questions/619955/how-does-proc-工作/
当一个程序想要从一个文件中读取时,它会发出各种系统库调用,最终以 open()、read()、close() 序列的形式进入内核(可能带有 seek()好措施)。内核采用提供的路径和文件名,并通过文件系统和设备 I/O 层将这些转换为物理读取请求(并且在许多情况下还写入请求——例如 atime 更新)到一些底层存储。
但是,它不必将这些请求专门转换为物理的持久存储。内核的约定是发出特定的系统调用集将提供相关文件的内容。在我们的物理领域中,“文件”的确切存在位置是次要的。
推荐阅读
- python - Python-MSSQL (pymssql) 设置字段Identity Column
- spring-mvc - 为什么我无法捕捉到我的异常?
- android - Recyclerview没有在android中显示数据
- c# - 提交更改后DataGridView不更新c#linq
- reporting-services - SSRS 计算上一年 2 月的最后一天,闰年不返回 29
- apache-spark - 如何根据先前的连续行过滤掉行?
- javascript - PHP strtotime() 等效于 Javascript 中的 RFC 3339 次
- python - TensorBoard 不会更新 TensorFlow Slim 的标量
- xml - Perl:XML Twig 插入数据
- database - 第一次运行 docker-compose up 时运行迁移或加载模式的最佳方法是什么?