【问题标题】:ENODEV error in MMAPMMAP 中的 ENODEV 错误
【发布时间】:2013-06-04 04:42:03
【问题描述】:

我正在尝试对新文本文件(作为参数给出)进行简单映射,但在 mmap 调用中出现 ENODEV 错误。 fd 没问题(open call 中没有错误)。

根据文档,此错误表示“指定文件的底层文件系统不支持内存映射”。或者从另一个来源我发现它可能意味着 fd 是一个特殊文件的文件描述符(一个可能用于映射 I/O 或设备内存的文件)。我不明白为什么会出现这些原因。

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

#define SIZE1 10240

int main(int argc, char *argv[]){
    char *addr;
int fd;

mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;

if(fd = open(argv[1], O_RDWR | O_CREAT | O_TRUNC, mode) == -1){
    printf("error @ open\n");       
}

addr = (char*) mmap(NULL, SIZE1, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
...
munmap(addr, SIZE1);
return 0;
}

【问题讨论】:

  • argv[1] 的值..???
  • 这是文件名,作为参数传递

标签: c linux mmap


【解决方案1】:

这条线断了:

if(fd = open(argv[1], O_RDWR | O_CREAT | O_TRUNC, mode) == -1){

您需要在赋值前后加上括号,因为比较运算符== 的优先级高于赋值运算符=。试试这个:

if ((fd = open(argv[1], O_CREAT | O_TRUNC, mode)) == -1) {

【讨论】:

  • 谢谢 Will,你是对的,我不认为 fd 是问题所在,但如果是这样的话,我会收到 EACCES 或 EBADF 错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
  • 2018-06-06
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多