2013-06-04 3 views
-1

Я пытаюсь сделать простое сопоставление нового текстового файла (заданного как параметр), и я получаю ошибку ENODEV в вызове mmap. Fd в порядке (нет ошибки при открытом вызове).Ошибка ENODEV в MMAP

В соответствии с документацией эта ошибка означает: «Основная файловая система указанного файла не поддерживает сопоставление памяти». или из другого источника, я обнаружил, что это может означать, что 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; 
} 
+0

значение argv [1] .. ??? –

+0

Это имя файла, переданное как параметр – ednincer

ответ

2

Эта линия нарушена:

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

Вы должны добавить круглые скобки вокруг присваивания, так как оператор сравнения == имеет более высокий приоритет, чем оператор присваивания =. Попробуйте это вместо:

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

+0

Спасибо, вы правы, я не думал, что проблема была в fd, хотя я бы получил ошибку EACCES или EBADF, если это так. – ednincer

Смежные вопросы