C MMAP中的ENODEV错误

C MMAP中的ENODEV错误,c,linux,mmap,C,Linux,Mmap,我试图对一个新的文本文件(作为参数给出)进行简单的映射,但在mmap调用中发现了一个ENODEV错误。fd正常(打开调用中无错误) 根据文档,此错误意味着“指定文件的底层文件系统不支持内存映射”。或者从另一个来源我发现,这可能意味着fd是一个特殊文件的文件描述符(可能用于映射I/O或设备内存)。我不明白为什么会有这些原因 #include <sys/mman.h> #include <sys/stat.h> #include <fcntl.h> #includ

我试图对一个新的文本文件(作为参数给出)进行简单的映射,但在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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义大小1 10240
int main(int argc,char*argv[]){
char*addr;
int-fd;
模式=S|u IRUSR | S|u IWUSR | S|u IRGRP | S|IROTH;
如果(fd=打开(argv[1],O|u RDWR | O|u CREAT | O|u TRUNC,模式)=-1){
printf(“错误@open\n”);
}
addr=(char*)mmap(NULL,SIZE1,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);
...
munmap(地址,尺寸1);
返回0;
}
此行已断开:

if(fd=open(argv[1],O|RDWR | O|u CREAT | O|u TRUNC,mode)=-1){

您需要在赋值周围添加括号,因为比较运算符
==
的优先级高于赋值运算符
=
。请尝试以下操作:


if((fd=open(argv[1],O|CREAT | O| u TRUNC,mode))=-1{

argv[1]的值…??这是文件名,作为参数传递谢谢,你是对的,我认为fd不是问题,我想如果是这样的话,我会收到一个EACCES或EBADF错误。