使用mmap复制文件

时间:2011-07-23 00:16:19

标签: linux file memory-management mmap

是否可以将源文件映射到目标文件的mmaped区域,作为将源复制到目标的方法?我尝试了一个简单的实现(下面),但它不起作用..

int main(int argc, char *argv[])
{
    struct stat ss;
    int src = open(argv[1], O_RDONLY);

    fstat(src, &ss);

    int dest = open(argv[2], O_RDWR | O_CREAT | O_TRUNC, ss.st_mode);

    void *dest_addr = mmap(NULL, ss.st_size, PROT_WRITE, MAP_SHARED, dest, 0);
    printf("dest is: %x\n", dest_addr);

    void *src_addr = mmap(dest_addr, ss.st_size, PROT_READ, MAP_PRIVATE | MAP_FIXED, src, 0);
    printf("src is: %x\n", src_addr);

    if (munmap(dest_addr, ss.st_size))
        printf("munmap failed");

    if (munmap(src_addr, ss.st_size))
        printf("munmap failed");
}

上面将源“映射”到目标mmap上,但是这并没有像希望的那样直接到达实际文件。我只是天真?

1 个答案:

答案 0 :(得分:3)

将两个文件映射到同一个内存区域是有问题的。这个内存的内容应该是什么,来自第一个文件或第二个文件的数据,还是混合?这不起作用。

您可以做的是将两个文件和memcpy从一个映射区域映射到另一个映射区域。但请注意,首先创建文件并设置其长度是个好主意,否则mmap可能会返回SIGBUS(请参阅文档)。

  

SIGBUS尝试访问没有的部分缓冲区   对应于文件(例如,超出文件末尾,   包括另一个进程截断文件的情况。)