#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<stdio.h>
int main(){
int fd;
char bf[4096];
int buf_size=4096;
fd = open("/proc/18022/cmdline", O_RDONLY);
int bytes = read(fd, bf, buf_size-1);
printf("%d %s\n\n",bytes,bf);
close(fd);
}
以上代码始终只读取3072个字节,而cmdline
的字符数多于3072个。
如果我将cmdline
的内容复制到gedit,然后在这个新创建的文件上运行上面的代码,那么它正在读取该文件的所有字节。
我用谷歌搜索它,发现它读取的字节最多为SSIZE_MAX
,但我怀疑的是它在第二种情况下读取所有字节的原因。
答案 0 :(得分:4)
即使您知道自己已经为阅读分配了足够的空间,也不应该依赖于从第一次尝试中读取整个文件。相反,你应该读取块并处理chunk-by-chunk中的字节:
char buff[4096];
while((cnt = read(fd, bf, buf_size-1)) > 0) {
// process the bytes just read, or append them to
// a larger buffer
}
从read()的手册页引用:
如果此数字小于请求的字节数,则不是错误;这可能发生在例如因为现在实际可用的字节数较少(可能是因为我们接近文件结尾,或者因为我们正在从管道或终端读取),或者因为read()被中断了信号。
对于/proc
个文件,我们可以看到here:
这个目录中文件最显着的特点是所有文件大小均为0,kcore,mtrr和self除外。
和
您可能想知道如何查看文件大小为0的进程的详细信息。如果您将其视为内核窗口,则更有意义。该文件实际上并不包含任何数据;它只是作为指向实际过程信息所在位置的指针。
这意味着这些伪文件的内容由内核发送,并按内核要求的大批量发送。这看起来非常类似于管道,其中a产生写入数据并且消费者读取它,每个管道以不同的速度运行。