【发布时间】:2014-04-24 04:14:02
【问题描述】:
我有以下代码段:
char*
Sender::PrepareData(char* filename, unsigned long long int bytesToTransfer)
{
int fd, pagesize;
char *data;
ifstream file(filename, ios::binary | ios::ate);
int size = file.tellg();
cout << "File Size: " << size << endl;
if(size < bytesToTransfer)
{cout << "File smaller than specified number of bytes {" << bytesToTransfer << "} to transfer -- Exiting!\n"; exit(1);}
fd = open(filename, O_RDONLY);
if (fd==NULL) {fputs ("File error",stderr); exit (1);}
cout << "File Open: " << filename << endl;
pagesize = getpagesize();
cout << "Pagesize: " << pagesize << endl;
data = static_cast<char*>(mmap((caddr_t)0, bytesToTransfer, PROT_READ, MAP_SHARED, fd, 0));
if (*data == -1) {fputs ("Memory error",stderr); exit (2);}
return data;
}
这似乎适用于文本和 .deb 文件 - 但是,当尝试使用 ~3MB 图像文件 (.jpg) 时,我会遇到内存错误:
File Size: 3333840
File Open: t1.jpg
Pagesize: 4096
Memory error[Inferior 1 (process 3293) exited with code 02]
我是不是用错了mmap()?我正在尝试编写一个简单的包装器,它将接受任何类型的文件并返回一个包含指定字节数的 char*。
【问题讨论】:
-
我已经更新了我的标题。
-
ostream << char*如何知道要写入多少字节?肯定有一些重要信息丢失了.. 还有,为什么*data == -1表示存在“内存错误”? -
这适用于 180MB+ .txt 文件
-
我只是根据手册页:
On error, the value MAP_FAILED (that is, (void *) -1)-- 但感谢你们俩。我认为检查data==MAP_FAILED已经解决了我当前的问题。如果有人会发布官方答案,我会这样标记。