【问题标题】:read function in c only reading 3072 bytesc 中的读取函数仅读取 3072 个字节
【发布时间】:2015-05-27 19:18:01
【问题描述】:
#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,但我怀疑它为什么在第二种情况下读取所有字节。

【问题讨论】:

  • 您应该在将读取的字节作为字符串处理之前添加终止 NUL 字符(例如,使用 %s 格式打印它而不指定大小)。 if (bytes &gt;=0 &amp;&amp; bytes &lt; buf_size) { bf[bytes] = 0; .. } else { handle invalid case }
  • 一般情况下,总是检查文件IO函数的返回值,并打印错误(只有异常输出到stdout/stderr,有错误检查比较麻烦,值得) .总有一些错误,比如没有权限、程序或磁盘上的文件名错误、磁盘已满……如果您只是费心检测和报告任何错误,这些事情很容易解决。

标签: c io eof


【解决方案1】:

您不应该依赖从第一次尝试读取整个文件,即使您知道已分配足够的空间用于读取。相反,您应该分块读取并逐块处理字节:

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 的进程的详细信息。将其视为进入内核的窗口会更有意义。该文件实际上不包含任何数据;它只是作为实际进程信息所在位置的指针。

这意味着这些伪文件的内容是由内核发送的,按照内核的需要分批发送。这看起来非常类似于管道,其中生产者写入数据,消费者读取数据,它们每个都以不同的速度运行。

【讨论】:

  • 这是解决它的另一种方法,但我的问题是为什么只有在文件路径为 /proc/[pid]/cmdline 的情况下才会发生这种情况。
猜你喜欢
  • 1970-01-01
  • 2011-07-01
  • 2012-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
相关资源
最近更新 更多