2013-12-14 1 views
6

Я хочу создать файл и отобразить его в память. Я думаю, что мой код будет работать, но когда я запустил его, я получаю «ошибку шины». Я искал google, но я не уверен, как исправить эту проблему. Вот мой код:Ошибка открытия шины и mmap'ing файла

#include <stdio.h> 
#include <stdlib.h> 
#include <fcntl.h> 
#include <errno.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <sys/mman.h> 
#include <string.h> 

int main(void) 
{ 
    int file_fd,page_size; 
    char buffer[10]="perfect"; 
    char *map; 

    file_fd=open("/tmp/test.txt",O_RDWR | O_CREAT | O_TRUNC ,(mode_t)0600); 

    if(file_fd == -1) 
    { 
     perror("open"); 
     return 2; 
    } 

    page_size = getpagesize(); 

    map = mmap(0,page_size,PROT_READ | PROT_WRITE,MAP_SHARED,file_fd,page_size); 

    if(map == MAP_FAILED) 
    { 
     perror("mmap"); 
     return 3; 
    } 

    strcpy(map, buffer); 

    munmap(map, page_size); 
    close(file_fd); 
    return 0; 
} 
+1

Использовать отладчик (так что скомпилировать с помощью 'gcc -Wall -g' и debug с' gdb') –

+0

У вас есть переменная 'page_size', но вы, кажется, используете' pege_size' в своем вызове 'mmap() ' –

+0

' addr' в 'mmap()' должен быть 'NULL', а не' 0'. – yegorich

ответ

9

Вы создаете новый нулевой размер файла, вы не можете увеличить размер файла с помощью mmap. При попытке написать вне содержимого файла вы получите ошибку шины.

Использование, например. fallocate() в дескрипторе файла, чтобы выделить место в файле.

Обратите внимание, что вы также пропускание PAGE_SIZE как смещение ттар, который, кажется, не имеет большой смысл в вашем примере, вы должны сначала расширить файл pagesize + strlen(buffer) + 1, если вы хотите написать buf в это место. Скорее всего, вы хотите начать с начала файла, поэтому передайте 0 в качестве последнего аргумента mmap.

+0

Спасибо, вы спасли меня довольно много времени :) –

+0

BTW просто записка, поскольку я оказался здесь в подобном случае, но в моем случае я * * делал fallocate - однако диск (RAM-диск) в этом случае был full - и память обращается к сообщениям успешной ошибки fallocate и mmap. Только один, чтобы следить за 8) –

+0

@nos, Спасибо за отличное решение. – Frank

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