Можно ли выделить двумерный массив как разделяемую память с IPC? - PullRequest
3 голосов
/ 25 декабря 2009

Я хочу выделить общую память в виде двумерного массива с использованием IPC. Я попробовал следующее:

id_shmem = shmget(ipc_key, sizeof(int)*rows*columns, IPC_CREAT|0666);

matrix = (int **)shmat(id_shmem, 0, 0);

Проблема в том, что всякий раз, когда я пытаюсь что-то записать в матрицу, я получаю ошибку сегмента.

Ответы [ 2 ]

14 голосов
/ 25 декабря 2009

int ** - это не двумерный массив, это скорее массив указателей. Не следует хранить указатели в разделяемой памяти, поскольку сегмент разделяемой памяти может быть размещен по разным адресам в разных процессах. Попробуйте использовать простой, плоский 1D массив, который будет "эмулировать" 2D массив с некоторой магией индекса, т.е..

x,y -> y*width+x
3 голосов
/ 25 декабря 2009

Обычной практикой для структур в разделяемой памяти является хранение смещений, а не указателей. Это позволяет обойти тот факт, что память может отображаться по разным виртуальным адресам в разных процессах.

Другой распространенный подход - сначала разрешить процессу запрашивать сопоставление, предоставляемое ОС, а затем каким-то образом передать полученный виртуальный адрес всем другим процессам, которые необходимо присоединить к той же памяти, и попросить их запросить фиксированное сопоставление по этому адресу.

...