文件系统是由内核维护的/proc/
“幻觉”,它不会费心给出(大部分)其伪文件的大小(因为计算“真实”大小通常涉及构建整个文本伪文件的内容),并期望/proc/
从第一个字节到最后一个字节(即直到 EOF)以合理大小(例如 1K)的块顺序读取大多数 [pseudo-] 文本文件。有关详细信息,请参见proc(5)手册页。
因此,无法在单个系统调用(例如stat(2)/proc/self/maps
中获取(某些文件的真实大小,例如or ) ,因为它会给出 0 的大小,如stat(1)或ls(1)命令所报告的那样)。阅读这些文本文件的典型方式可能是/proc/sys/net/ipv4/ip_forward
FILE* f = fopen("/proc/self/maps", "r");
// or some other textual /proc file,
// e.g. /proc/sys/net/ipv4/ip_forward
if (f)
{
do {
// you could use readline instead of fgets
char line[256];
memset (line, 0, sizeof(line));
if (NULL == fgets(line, sizeof(line), f))
break;
// do something with line, for example:
fputs(line, stdout);
} while (!feof (f));
fclose (f);
}
当然,某些文件(例如 /proc/self/cmdline
)被记录为可能包含NUL字节。你需要一些fread
给他们。