簡體   English   中英

當mmap()使用JPG文件時,為什么會出現內存錯誤?

[英]Why do I get memory errors when mmap()'ing a JPG file?

我有以下代碼部分:

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 *。

您應該只檢查data == -1 (或者更好, MAP_FAILED )而不是 *data == -1 (通過*解除引用是錯誤的)。

您的代碼失敗的原因是因為每個JPEG文件的第一個字節是十六進制的FF或帶符號十進制的-1。

有關JPEG的更多詳細信息,請參閱Google的“JPEG文件格式”。 例如,在此頁面上搜索“SOI”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM