读取c中的函数只读取3072个字节

时间:2015-05-27 19:18:01

标签: c io eof

#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,但我怀疑的是它在第二种情况下读取所有字节的原因。

1 个答案:

答案 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产生写入数据并且消费者读取它,每个管道以不同的速度运行。