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

2024-02-05

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

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* 版本定义了一些大小和内容。它是在运行中秘密生成它以供读取还是其他什么?我在这里缺少什么?

编辑: 因为我可以清楚地从它们中读取(),有什么方法可以获取可能的可用字节?或者我必须一直读到 EOF?


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

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

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

至于奖励问题,似乎没有办法指示文件的大小,只能在读取时指示 EOF。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我不能 mmap /proc/self/maps? 的相关文章

随机推荐