2012-07-22 4 views
2

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

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

// compile with -lrt 

char fname[64]; 
int fd; 

int main() 
{ 
    int * sm; 
    sprintf(fname, "%d_%u", 4, 4); 

    if ((fd = shm_open(fname, O_CREAT | O_RDWR, 0777)) == -1) 
    {   
     perror(NULL); 
     return 0; 
    } 
    sm = (int*)mmap(0, (size_t)4096, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, 
     fd, 0); 
    printf("Now trying to see if it works!\n"); 
    sm[0] = 42; 
    printf("%d, %d!\n", sm[0], sm[1]); 

    return 0; 
} 

Выход я получаю следующее

Now trying to see if it works! 
Bus error 
+2

Вам нужно проверить, возвращает ли 'mmap'' MAP_FAILED', и если да, обратитесь к 'errno', чтобы выяснить, почему. (Кроме того, вы бы не пытались написать обходной объект с нулевой длиной, не так ли? «Mmap» и запись в область «mmap» могут увеличить объект.) –

+0

Связанный: http: // stackoverflow.com/questions/212466/what-is-a-bus-error –

ответ

4

Недавно созданный объект имеет размер, равный нулю. Вы не можете изменить размер объекта, сопоставляя его или записывая в его сопоставление. Вероятно, вам нужно позвонить ftruncate до mmap. (Если в вашем коде была проверка ошибок, это было бы намного проще выяснить.)

+0

В этом случае проверка ошибок не имеет значения, так как mmap с радостью отобразит файл с нулевой длиной, если длина выравнивается по странице. – sergio91pt

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