2012-02-13 1 views
4

Мне нужно сделать несколько потоков в и из классов с помощью mmap() в Linux. Для этого я попытался сделать некоторый тестовый код, который записывает некоторые целые числа в файл, сохраняет его, снова загружает и записывает данные в файл в cout. Если этот тестовый код работает, тогда он не будет проблемой для создания потока и выхода из него.Как читать и писать с помощью mmap() в системе Linux

Когда я только начинал, у меня были сегментные ошибки, и если бы я не понял, что ничего не произошло, я немного погубился. Я нашел эту книгу http://www.advancedlinuxprogramming.com/alp-folder/alp-ch05-ipc.pdf, где около страницы 107 есть полезный код. Я копировать вставить этот код и сделал несколько небольших изменений и получил этот код:

int fd; 
void* file_memory; 

/* Prepare a file large enough to hold an unsigned integer. */ 
fd = open ("mapTester", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); 

//Make the file big enough 
lseek (fd, 4 * 10 + 1, SEEK_SET); 
write (fd, "", 1); 
lseek (fd, 0, SEEK_SET); 

/* Create the memory mapping. */ 
file_memory = mmap (0, 4 * 10, PROT_WRITE, MAP_SHARED, fd, 0); 
close (fd); 

/* Write a random integer to memory-mapped area. */ 
sprintf((char*) file_memory, "%d\n", 22); 

/* Release the memory (unnecessary because the program exits). */ 
munmap (file_memory, 4 * 10); 

cout << "Mark" << endl; 

//Start the part where I read from the file 

int integer; 

/* Open the file. */ 
fd = open (argv[1], O_RDWR, S_IRUSR | S_IWUSR); 

/* Create the memory mapping. */ 
file_memory = mmap (0, 4 * 10, PROT_READ | PROT_WRITE, 
MAP_SHARED, fd, 0); 
close (fd); 

/* Read the integer, print it out, and double it. */ 
scanf ((char *) file_memory, "%d", &integer); 
printf ("value: %d\n", integer); 
sprintf ((char*) file_memory, "%d\n", 2 * integer); 

/* Release the memory (unnecessary because the program exits). */ 
munmap (file_memory, 4 * 10); 

Но я получаю сегмент Фултс после «метки» соиЬ.

Тогда я заменить «прочитать часть» с этим:

fd = open("mapTester", O_RDONLY); 

int* buffer = (int*) malloc (4*10); 

read(fd, buffer, 4 * 10); 

for(int i = 0; i < 1; i++) 
{ 
    cout << buffer[i] << endl; 
} 

Вот некоторые рабочий код, который показывает мне, что файл пуст. Я пытаюсь написать несколько способов записи в отображение без каких-либо изменений в результате.

Так как же я собираюсь написать свой код? И мой код чтения mmap выглядит нормально (на всякий случай вы можете увидеть некоторые очевидные недостатки)?

Я нашел некоторые другие ресурсы, которые еще не помогли мне, но поскольку я новый пользователь, я могу опубликовать только max 2 ссылки.

ответ

4

Вы должны проверить результат mmap. Если он дает MAP_FAILED, выйдите errno, чтобы узнать почему.

И вы будете лучше MMAP мультипликатор страниц, часто 4К байт каждый, и дал по sysconf(_SC_PAGESIZE)

Вы можете использовать stat, чтобы узнать размер (как и многие другие цифры о) некоторого заданного файла.

Вы можете использовать strace в существующих программах Linux, чтобы узнать, какие системные вызовы они делают.

Смотрите также this о /proc/ и т.д.

+1

Спасибо за помощь, я узнал, что файл, который я написал, защищен от записи и из-за этого все не удалось. – RobbingDaHood

1

Ваш scanf() вызов должен быть sscanf(), а вторая открытая следует использовать "mapTester" вместо argv[1] в качестве имени файла. Когда я исправляю эти ошибки, ваша опубликованная программа работает (распечатывает 22 и оставляет 44 в файле).

+0

Я не мог заставить код работать с изменениями, которые вы сказали. Я не знаю, как форматировать код в комментарии, поэтому я просто помещаю его в конец сообщения. Я использую команду компилятора g ++, возможно, вы используете другую? – RobbingDaHood

+0

Хорошо, я не могу добавить код, потому что он длинный. Я скопировал код, который я написал здесь, и изменил 2 места, и он пришел с ошибкой сегментации в последней части кода. Но спасибо за 2 хорошие sugestion, очень полезно :) – RobbingDaHood

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