fork — Forked Process не может прочитать из общей памяти

Я изучаю управление процессами и общую память, и мне было интересно, может ли кто-нибудь мне помочь. Я пытаюсь прочитать текстовый файл большого размера (2 МБ) с разветвленным родительским процессом и передать его соответствующему дочернему процессу, чтобы … ну … обработать. Тем не менее, моя программа доказательства концепции мини не может прочитать данные, которые я записываю в общую память. Вызовы «Capacity ()» и «Длина ()» работают нормально, но на самом деле попытка получить данные, хранящиеся там, возвращает пустую строку. Я даже пытался скопировать содержимое указателя в массив символов, но все равно ничего. Какие-нибудь мысли?

Код программы:

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

using namespace std;

#define SHM_SIZE 2000000    // 2 MB of shared memory

int main(int argc, char* argv[])
{
string* data = (string*) mmap(NULL, SHM_SIZE, PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_ANONYMOUS, -1, 0);

printf("Shared memory capacity before reserve: %ld\n", data->capacity());
data->reserve(SHM_SIZE); // make sure string can use all available space
printf("Shared memory capacity after reserve: %ld\n", data->capacity());

switch(fork())
{
case -1:
printf("Something went wrong ... exiting program\n");
break;
case 0:
usleep(1000 * 1000 * 2); // force child to wait for sanity purposes
printf("\nChild capacity:  %ld\n", data->capacity());
printf("Child contents:  %s\n", data->c_str());
break;
default:
// Sample input ... file reading logic omitted for brevity
*data = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean leo elit, aliquam ""vitae aliquam sed, rhoncus et mi. Aliquam erat volutpat. Phasellus non urna sit amet ""enim tincidunt aliquam quis sit amet orci. Maecenas velit turpis, venenatis eu diam ""vel, varius volutpat nulla. Nam mi massa, tristique eget imperdiet id, dictum ut urna. ""Nulla id massa placerat, finibus purus quis, ornare neque. Vivamus eget varius ante. ""Aenean varius ac neque quis ultricies. Donec vitae bibendum dolor, vitae tempor augue.";
printf("\nParent capacity:  %ld\n", data->capacity());
printf("Parent contents:  %s\n", data->c_str());

wait(NULL);
munmap(data, sizeof *data);
printf("\nHello world\n");
break;
}

return 0;
}

Выход:

MacBook-Pro:sharedmem-test slehr$ ./sharedmem-mapred
Shared memory capacity before reserve: 22
Shared memory capacity after reserve: 2000015

Parent capacity:  2000015
Parent contents:  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean leo elit, aliquam vitae aliquam sed, rhoncus et mi. Aliquam erat volutpat. Phasellus non urna sit amet enim tincidunt aliquam quis sit amet orci. Maecenas velit turpis, venenatis eu diam vel, varius volutpat nulla. Nam mi massa, tristique eget imperdiet id, dictum ut urna. Nulla id massa placerat, finibus purus quis, ornare neque. Vivamus eget varius ante. Aenean varius ac neque quis ultricies. Donec vitae bibendum dolor, vitae tempor augue.

Child capacity:  2000015
Child contents:

Hello world
MacBook-Pro:sharedmem-test slehr$

1

Решение

std::string скорее всего, это будет какая-то структура данных с размером, длиной, указателем (или чем-то похожим). Вы не можете ожидать, что его внутренний указатель будет указывать на разделяемую память

с mmapв памяти вы должны использовать необработанные указатели, например

auto data = (char*) mmap(NULL, SHM_SIZE, PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_ANONYMOUS, -1, 0);

Конечно ты должен тест на неудачу:

if (data==(char*)MAP_FAILED) { perror("mmap"); exit(EXIT_FAILURE); };

Прочитай заново ММАП (2)

Вы могли бы рассмотреть shm_overview (7) (и посмотрите на sem_oveview (7) для синхронизации)

Читать Расширенное программирование в Linux

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]