c - 为什么我不能 mmap/proc/self/maps?

标签 c linux linux-kernel mmap

具体来说:为什么我可以这样做:

FILE *fp = fopen("/proc/self/maps", "r");
char buf[513]; buf[512] = NULL;
while(fgets(buf, 512, fp) > NULL) printf("%s", buf);

但不是这个:

int fd = open("/proc/self/maps", O_RDONLY);
struct stat s;
fstat(fd, &s); // st_size = 0 -> why?
char *file = mmap(0, s.st_size /*or any fixed size*/, PROT_READ, MAP_PRIVATE, fd, 0); // gives EINVAL for st_size (because 0) and ENODEV for any fixed block
write(1, file, st_size);

我知道/proc 文件不是真正的文件,但它似乎有一些为 FILE* 版本定义的大小和内容。它是在运行中 secret 生成它以供阅读之类的吗?我在这里缺少什么?

编辑: 正如我可以清楚地从他们那里读取(),有没有办法获得可能的可用字节?还是我一直读到 EOF?

最佳答案

它们是在您阅读时即时创建的。也许这会有所帮助,这是一个展示如何实现 proc 文件的教程:

https://devarea.com/linux-kernel-development-creating-a-proc-file-and-interfacing-with-user-space/

tl;dr:你给它一个名字并读写处理程序,就是这样。从内核开发人员的角度来看,Proc 文件应该非常容易实现。不过,它们的行为不像功能齐全的文件。

至于奖金问题,似乎没有办法指示文件的大小,只有 EOF on reading。

关于c - 为什么我不能 mmap/proc/self/maps?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66225418/

相关文章:

c - C 中的信号处理

c - Bool 函数在不满足条件的情况下返回 true - 忽略 printf()

regex - 使用正则表达式匹配字符串结尾

linux - 内核编译找不到 .config 文件

linux - 需要快速中断处理程序

c - 函数有返回值,调用函数时不会报错

c++ - 如何检查 AVX intrinsic __m256 的 inf

python - access(2) vs stat(2) 检查文件是否可执行

linux - ARM Linux Atags 与设备树

linux-kernel - 如何在 Linux 中添加新的 qdisc