Проблемы с mmap сложных типов - PullRequest
0 голосов
/ 02 октября 2011

У меня проблема с попыткой доступа к разделяемой памяти с помощью mmap для сложных типов.

Итак, я выделяю свою память так же, как и в моем родительском процессе:

/* Create mmap file */
fid = open(TMP_FILE_NAME, O_RDWR | O_CREAT | O_EXCL, (mode_t) 0755);
if (fid < 0)
{
  printf("Bad Open of mmap file <%s>\n", TMP_FILE_NAME);
  die(-1);
}

/* Make mmap file Buffer Size */
status = ftruncate(fid, INPUT_BUFFER_SIZE); 
if (status)
{
    printf("Failed to ftruncate the file <%s>, status = %d\n", TMP_FILE_NAME, status);
    die(-1);
}

/* Initialize Shared Memory */
mmap_ptr = mmap((caddr_t) 0,
      INPUT_BUFFER_SIZE,        // Default Buffer Size
      PROT_WRITE | PROT_READ,   // R/W Permissions
      MAP_SHARED, // No file backing
      fid,  
      (off_t) 0);
if (mmap_ptr == MAP_FAILED)
{
    printf("Failed to perform mmap, Exiting\n");
    die(-1);
}

Теперь структура, которую я передаю в память своему дочернему процессу, выглядит следующим образом:

/* Data structue for IPC */
typedef struct {
    int current_active_id;
    int consume_remaining;
    Queue buffer;
} input_buffer;

где Queue является классом структуры данных из следующего: http://www.idevelopment.info/data/Programming/data_structures/c/Queue/Queue.shtml

В моем дочернем процессе все нормально, когда я делаю это, он возвращает правильное значение:

printf("Got here... Shared Mem: %d\n", input_queue->consume_remaining);

но когда я делаю что-то вроде:

IsEmpty(input_queue->buffer)

он вылетает и в коде Очереди только делает это:

return Q->Size == 0;

Любая помощь будет оценена, спасибо !!

Ответы [ 2 ]

2 голосов
/ 02 октября 2011

Queue является указателем на struct QueueRecord и должен быть выделен как таковой, предположительно, с использованием того же сегмента разделяемой памяти. обратите внимание, что это также должно быть сопоставлено по одному и тому же адресу как у родителя, так и у ребенка, иначе вы не сможете разыменовать его.

1 голос
/ 02 октября 2011

Структура, которую вы помещаете в карту, содержит указатели.Все указатели относятся к адресному пространству процесса, который их создал.

Если другой процесс не отображает по тому же адресу, или если он это делает, но выделения, сделанные для очереди, не принимаютсяиз этого буфера указатели будут недействительными в другом процессе.

...