【发布时间】: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 >=0 && bytes < buf_size) { bf[bytes] = 0; .. } else { handle invalid case } -
一般情况下,总是检查文件IO函数的返回值,并打印错误(只有异常输出到stdout/stderr,有错误检查比较麻烦,值得) .总有一些错误,比如没有权限、程序或磁盘上的文件名错误、磁盘已满……如果您只是费心检测和报告任何错误,这些事情很容易解决。