2015-10-24 1 views
2

Это мой код:В C mmap файл для записи: Permission denied. Linux

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

    int main() 
    { 
    int fd=open("/home/victor/hello",O_WRONLY); 

    if(fd<0) 
    { 
      perror("Open"); 
      exit(EXIT_FAILURE); 
    } 

    struct stat sbuf; 

    if(fstat(fd, &sbuf)==-1){ 
      perror("stat"); 
      close(fd); 
      exit(EXIT_FAILURE); 
    } 

    void* file_memory= mmap(NULL, sbuf.st_size, PROT_WRITE, MAP_SHARED,fd,0); 
    if (file_memory == MAP_FAILED) { 
      perror("Error mmapping the file"); 
      close(fd); 
      exit(EXIT_FAILURE); 
    } 

    return 0; 
    } 

Я попытался это слишком

int fd=open("/home/victor/hello",O_WRONLY|0777); 

, но это та же ошибка:

Ошибка mmapping файл: Отказано в

Doing ls -l | grep hola -rwxrwxrwx 1 victor victor 24 окт 24 01:47 привет

Что случилось?

+6

AFAIK 'ттар()' ' 'ы PROT_WRITE' может подразумевают 'PROT_READ', а' PROT_READ' несовместим с 'open()', используя 'O_WRONLY'. –

+2

@IwillnotexistIdonotexist: Сделайте это ответом. Это правильный вариант. –

+1

@Iwillnotexist Idonotexist Спасибо! Я меняю open() O_WRONLY на O_RDWR, и все в порядке! –

ответ

3

Из инструкции GLibC, и, как уже указывал R .. и Iwillnotexist Idonotexist выше:

Note that most hardware designs cannot support write permission without read permission, and many do not distinguish read and execute permission. Thus, you may receive wider permissions than you ask for, and mappings of write-only files may be denied even if you do not use PROT_READ.

http://www.gnu.org/software/libc/manual/html_node/Memory_002dmapped-I_002fO.html

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