MMAP中的ENODEV错误

我试图做一个新的文本文件(作为参数给出)的简单映射,我在mmap调用中遇到ENODEV错误。 fd没问题(打开电话没有错误)。

根据文档,这个错误意味着“指定文件的底层文件系统不支持内存映射”。 或从另一个来源,我发现它可能意味着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; } 

这条线断了:

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

您需要在作业周围添加圆括号,因为比较运算符==具有比赋值运算符=更高的优先级。 试试这个:

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