C Отображение указателя общей памяти - PullRequest
0 голосов
/ 06 сентября 2011

У меня есть структура данных следующим образом:

struct s1{
unsigned char* ptr;//points to an element in the shared memory
};

struct s1* s1Arr;

И я выделил блок совместно используемой памяти, и указатель на него:

unsigned char* shm_ptr.

У меня есть массив s1 с тем же количеством элементов, что и у выделенных мною элементов shm_ptr.

//point all the ptr elements of the struct to the shared memory elements(parallel array)
for(i = 0; i < count; i++)
{
shm_ptr[i] = 99;
s1Arr[i].ptr = &shm_ptr[i];
printf("val=%d\n". *s1Arr[i].ptr);
}

Когда я иду на печать * s1Arr [i] .ptr, он печатает только i, где i равно 0, 1 ... в то время как он должен печатать 99. Есть мысли о том, что я делаю не так?

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

void* allocArray_shared(int elementCount, int elementByteSize, int* shmid, key_t key)
{
    printf("allocshared errno=%d\n", errno);
    //size of entire array(cols*rows* byte size + row pointers)
    int array_size = elementByteSize * elementCount;


    //Allocate enough space for all elements + row pointers
    *shmid = shmget(key, array_size, 0666 | IPC_CREAT);

    char * arr = (char*)shmat(*shmid, NULL, 0);
    if(!arr) return NULL;

    printf("allocshared end errno=%d\n", errno);

    //Return the pointer to the first row pointer
    return (void*)arr;
}

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

1 Ответ

1 голос
/ 06 сентября 2011

У меня 99 отображается 5 раз с этим кодом.Я думаю, что единственное изменение заключается в том, что я удалил ключевое слово struct в начале объявления вашего массива структуры (это было struct s1 * s1Arr).

РЕДАКТИРОВАТЬ: Я вернул ключевое слово struct и получил тот же результат, поэтому я не знаю, почему мои результаты отличаются от ваших.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...