使用mmap和memcpy从A复制文件到B

10

我试图使用MMAP和MEMCPY将文件从A复制到B。下面的代码完美地实现了这一点,但是当我使用CMP比较块时,它说“mem_copy.c目标不同:第1个字节,第1行”,我不确定为什么。

int main(int argc, char **argv){

    int sfd, dfd;
    char *src, *dest;
    struct stat s;

    /* SOURCE */
    sfd = open("hello.c", O_RDONLY);
    fstat(sfd, &s); // st_size = blocksize

    printf("%d\n", (int)s.st_size);

    src = mmap(NULL, s.st_size, PROT_READ, MAP_PRIVATE, sfd, 0);

    /* DESTINATION */
    dfd = open("dest", O_RDWR | O_CREAT, 0666);

    ftruncate(dfd, s.st_size;

    dest = mmap(NULL, s.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, dfd, 0);

    /* COPY */

    memcpy(dest, src, s.st_size);

    munmap(src, s.st_size);
    munmap(dest, s.st_size);

    close(sfd);
    close(dfd);

   return 0;
}

4
这不可能是你的代码,显然有语法错误。此外,size_t可以用格式%zu轻松打印。 - Jens Gustedt
请您能否分享完整的代码清单,包括失败的比较部分? - Chris Culter
抱歉,伙计们,但这是完整的代码。 - Bob Jane
1个回答

10

知道了。

int main(int argc, char **argv){

    int sfd, dfd;
    char *src, *dest;
    size_t filesize;

    /* SOURCE */
    sfd = open("hello.c", O_RDONLY);
    filesize = lseek(sfd, 0, SEEK_END);

    src = mmap(NULL, filesize, PROT_READ, MAP_PRIVATE, sfd, 0);

    /* DESTINATION */
    dfd = open("dest", O_RDWR | O_CREAT, 0666);

    ftruncate(dfd, filesize);

    dest = mmap(NULL, filesize, PROT_READ | PROT_WRITE, MAP_SHARED, dfd, 0);

    /* COPY */

    memcpy(dest, src, filesize);

    munmap(src, filesize);
    munmap(dest, filesize);

    close(sfd);
    close(dfd);

    return 0;
}

1
你认为改变获取文件大小的方式可以解决这个问题吗? - Serge Roussak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接