【问题标题】:Why do I get memory errors when mmap()'ing a JPG file?为什么在 mmap()'ing JPG 文件时出现内存错误?
【发布时间】: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 &lt;&lt; char* 如何知道要写入多少字节?肯定有一些重要信息丢失了.. 还有,为什么*data == -1 表示存在“内存错误”?
  • 这适用于 180MB+ .txt 文件
  • 我只是根据手册页:On error, the value MAP_FAILED (that is, (void *) -1) -- 但感谢你们俩。我认为检查data==MAP_FAILED 已经解决了我当前的问题。如果有人会发布官方答案,我会这样标记。

标签: c++ file-io mmap arrays


【解决方案1】:

您应该只检查data == -1(或者,更好的是MAP_FAILED)和*data == -1(在这里通过* 取消引用是错误的)。

您的代码失败的原因是每个 JPEG 文件的第一个字节是十六进制的 FF 或有符号十进制的 -1。

有关 JPEG 的更多详细信息,请在 Google 搜索“JPEG 文件格式”。例如,在this page 上搜索“SOI”。

【讨论】:

  • "您的代码失败的原因是每个 JPEG 文件的第一个字节是十六进制的 FF 或有符号十进制的 -1。" ——这就是我来 Stackoverflow 的那种花絮!很有趣:)
猜你喜欢
  • 2021-10-29
  • 2018-05-10
  • 1970-01-01
  • 1970-01-01
  • 2015-05-20
  • 1970-01-01
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
相关资源
最近更新 更多