2013-06-04 153 views
-1

我試圖做一個新的文本文件(作爲參數給出)的簡單映射,我在mmap調用中遇到ENODEV錯誤。 fd沒問題(打開電話時沒有錯誤)。MMAP中的ENODEV錯誤

根據文檔,此錯誤表示「指定文件的底層文件系統不支持內存映射。」或者從其他來源發現,它可能意味着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