linux read()函数关于缓冲区问题

sevenballs 2014-05-20 11:29:32
#include <fcntl.h>
#include <stddef.h>
#include <unistd.h>
#include <iostream>
#include <stdlib.h>
using namespace std;

void operate_file(char* argv[], int fd, size_t fsize){
size_t buff_size= sizeof(char) * 1024;
//char* buff = static_cast<char*>(malloc(buff_size));
char buff[buff_size];
int i = 0;
ssize_t len;
while((len = read(fd,buff,fsize))>0){
cout<<"len: "<<len<<endl;
cout<<buff<<endl;
cout<<++i<<endl;
}
//free(buff);
;
}
int main(int argc, char *argv[]) {
int fd;
//打开文件
fd = open(argv[1], O_RDWR,S_IRUSR );
if(fd == -1){
cout<<"open err"<<endl;
return -1;
}
size_t size = lseek(fd, 0, SEEK_END);
lseek(fd, 0, SEEK_SET);
//函数指针用于回调
void (*p_operate_file)(char* argv[], int fd, size_t fsize) = &operate_file;
p_operate_file(argv,fd,size);
//关闭文件
close(fd);
}

定义缓冲变量buff时如果是用定长数组方式的话会有非常奇怪的问题:

  1.并不会按照期望的一样缓冲区满了之后,文件指针会停在那里,然后下次循环时继续读。

   事实上read()操作会直接覆盖掉buff之后的内存单元

  2.如果文件比较大,(试验过3.8G单文件)则直接返回-1 ,不能继续读.

若采用注释了的,malloc形式的话,问题1也会出现,

但是问题2会有选择性的出现:

  1.buff所分配的内存大小较大(512Kbyte以上)时会出现问题2

  2.若buff分配的内存大小小于1Kbyte时,则可以正常读取
并且每次读取固定大小的内存单元(135152byte)

很奇怪不知道是什么原因...
系统环境是 Debian7 , gcc4.7
...全文
1178 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Johnblx 2014-05-28
  • 打赏
  • 举报
回复
我瞎猜,你第三个参数制定要读取1M,但是你的buffer只有1K,这肯定不行啊。
mujiok2003 2014-05-28
  • 打赏
  • 举报
回复
引用 4 楼 mujiok2003 的回复:
char buff[buff_size];
当文件较大时,栈溢出了
忽略。
mujiok2003 2014-05-28
  • 打赏
  • 举报
回复
只用使用了O_CREAT, open才需要第三个参数
mujiok2003 2014-05-28
  • 打赏
  • 举报
回复
char buff[buff_size];
当文件较大时,栈溢出了
sevenballs 2014-05-25
  • 打赏
  • 举报
回复
引用 1 楼 lyyslsw 的回复:
read(fd,buff,fsize))
你传入的参数fsize 是不是应该为buff_size


根据man page的说法第三个参数是读取的字节数
Johnblx 2014-05-21
  • 打赏
  • 举报
回复
read(fd,buff,fsize)) 你传入的参数fsize 是不是应该为buff_size

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧