C'mmap'导致分段错误。想法?

时间:2016-02-13 03:34:46

标签: c mmap fault

我正在尝试编写一个程序,使用'mmap'为学校读取文件。我在创建地图时遇到了一些困难。具体来说,我遇到了分段错误。我不确定我在这里做错了什么,所以一些具体的帮助将不胜感激。谢谢。

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>

int main(int argc, char* argv[])
{
    printf("Hello world!\n");

    FILE* fp;// File pointer
    int fd;// File descriptor
    size_t size;// Length of the file
    char* map;// File mmap

    /* Open the file */
    fp = fopen("data.txt", "r+");

    /* Get the file descriptor */
    fd = fileno(fp);
    printf("FD: %d\n", fd);

    /* Get the size of the file */
    fseek(fp, 0, SEEK_END);
    size = ftell(fp);
    fseek(fp, 0, SEEK_SET);
    printf("SIZE: %d\n", size);

    /* Map the file with mmap */
    map = mmap(NULL, size, PROT_READ, 0, fd, 0);

    if (map == MAP_FAILED)
    {
        printf("MMAP FAILED\n");
    } else {
        printf("MMAP SUCEEDED\n");
    }

    /* Do something with the map */
    int i;
    for (i = 0; i < size; i++)
    {
        char c;
        c = map[i];
        putchar(c);
    }

    fclose(fp);

    return(0);
}

1 个答案:

答案 0 :(得分:3)

您没有指定任何内容作为flag参数,您必须指定MAP_PRIVATEMAP_SHARED指定here

  

flags参数确定是否对映射进行更新          映射相同区域的其他进程可见,以及是否          更新将传递到基础文件。通过在flags中恰好包含以下值之一来确定此行为:

     

MAP_SHARED分享此映射。可以看到对映射的更新                 映射此文件的其他进程,并继续执行                 底层文件。 (准确控制何时更新                 贯彻到底层文件需要使用                 的msync(2)。)

     

MAP_PRIVATE                 创建私有的写时复制映射。更新                 映射对于映射相同的其他进程是不可见的                 文件,并没有传递到底层文件。它                 未指定是否对文件进行了更改                 mmap()调用在映射区域中可见。

在您的情况下,由于您只是阅读文件,MAP_PRIVATE应该足够了。

尝试:

map = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0);