gpt4 book ai didi

c - 使用 mmap 读/写文件时如何解决 ENODEV

转载 作者:太空宇宙 更新时间:2023-11-03 23:37:20 27 4
gpt4 key购买 nike

我正在尝试映射文件以进行读写,目前我收到错误代码 19:ENODEV。我正在使用一个有 2MB 空间的空白文件。

根据手册页,当文件不兼容映射时会发生此错误。如果这是真的,我不明白为什么;它只是一个普通的空文件。此外,它是由我的教授提供的,因此大概可以正常工作。还有其他事情吗?

这是我的代码:

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

int main(int argc, const char * argv[]) {
int fd = open("Drive2MB", O_RDWR, S_IRUSR | S_IWUSR | S_IXUSR);
if(fd < 0) {
printf("open failure\n");
exit(1);
}

char *drive = mmap(NULL, 1048576, PROT_WRITE, fd, MAP_SHARED, 0);
if(drive == MAP_FAILED) {
printf("map failure\n");
fprintf(stderr, "Value of errno: %d\n", errno);
exit(1);
}

//test
drive[513] = 'p';
printf("%c", drive[513]);
}

如果确实是文件,我将如何创建与 mmap() 兼容的文件。

最佳答案

两个错误:

char *drive = mmap(NULL, 1048576, PROT_WRITE, fd, MAP_SHARED, 0); 

应该是

char *drive = mmap(NULL, 1048576, PROT_WRITE, MAP_SHARED, fd, 0); 

并且您不能映射一个空文件,而只能映射一个已经有长度的文件。

要填充 Drive2MB,请执行 dd if=/dev/zero of=Drive2MB bs=1048576 count=1

MAP_SHARED 的值恰好为 1,因此它尝试 mmap stdout,这通常是无法映射的终端。

关于c - 使用 mmap 读/写文件时如何解决 ENODEV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55785334/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com