如何从C中的mmap区域获取固定大小的缓冲区?

时间:2013-04-10 15:01:18

标签: c io mmap

我想做下一个: 我有一个巨大的文件(超过4GB)。我想mmap它,然后从这个128字节的mmapped区域缓冲区。我该怎么做?要使用mmap文件,请使用:

int fd = open(file_name, O_RDONLY);
void* addr = mmap(0, /*ULONG_MAX*/100000000, PROT_READ, MAP_SHARED, fd, 0);

在这些字符串之后,我想在上面描述缓冲区,但我不知道如何在网上找不到它。

其他信息:file_name是文本文件。它包含字符串

UPD:我将尝试解释:我想要mmap文件,然后从mmapped区域取128个字节(实际上是chars)并将其放入某个缓冲区。现在我使用下一个代码:

char buffer[128];
struct str* addr = mmap(0, /*ULONG_MAX*/128, PROT_READ, MAP_SHARED, fd, 0);
scanf((char*)addr, "%s", buffer);
printf("%s\n", buffer);

但它不起作用。所以我正在寻找解决方案。

3 个答案:

答案 0 :(得分:2)

成功mmap后,文件的内容(最大为mmap'd大小)在addr指向的内存区域中可用。所以你可以做到

memcpy(buffer, addr, 128);

答案 1 :(得分:1)

哦,好吧,mmap这不是问题,scanf是个问题。这很简单。 Don't use scanf.要将mmap区域中128字节的固定块复制到另一个缓冲区,您需要memcpy

...
unsigned char *addr = mmap(0, /*ULONG_MAX*/100000000, PROT_READ, MAP_SHARED, fd, 0);
unsigned char buf[128];
...
memcpy(buf, addr + offset, 128);

这就是它的全部内容。

答案 2 :(得分:0)

如果要打印128个字符的每个块,请执行此操作

char buf[129];

// put a nul char to ensure the string will be terminated
buf[128] = '\0';

// other stuff you've done
....

// get the file mapped to addr memory pointer
void* addr = mmap(0, /*ULONG_MAX*/100000000, PROT_READ, MAP_SHARED, fd, 0);

long i = 0

while (i < 100000000)
{
    // copy out the 128 bytes of the block
    memcpy(buf, (char *) &addr[i], 128);

    // print it out
    printf("BUF: %s\n", buf);

    // move to the next block
    i += 128;
}