【问题标题】:C Shared memory pointer mappingC共享内存指针映射
【发布时间】:2011-09-06 04:48:20
【问题描述】:

我的数据结构如下:

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;
}

编辑: 发现问题..正在分配具有相同密钥的多个共享内存段,因此读/写重叠...呃...

【问题讨论】:

  • 你希望它显示什么?
  • 我认为您需要显示内存分配代码(共享和非共享)和打印代码。没有它,我们就在猜测你在做什么。
  • 我希望它打印 99,这是我将共享内存值设置为的值。
  • @Jonathan,更新帖子。
  • shm_ptr[i] = 99; s1Arr[i].ptr = &shm_prt[i];第二行是 shm_ptr 还是 shm_prt?

标签: c


【解决方案1】:

使用此代码,我得到 99 显示 5 次。我认为唯一的变化是我从结构数组声明的开头删除了关键字struct(它是struct s1 * s1Arr)。

编辑:我把 struct 关键字放回去,得到了相同的结果,所以我真的不知道为什么我的结果与你的不同。

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

s1 * s1Arr = new s1[5];
unsigned char * shm_ptr = new unsigned char[5];

for(int i = 0; i < 5; i++)
{
   shm_ptr[i] = 99;
   s1Arr[i].ptr = &shm_ptr[i];
   cout << ((int)*s1Arr[i].ptr) << "\n";
}

【讨论】:

  • 是的,我发现这也行得通……我只是很愚蠢,用同一个键分配多个共享内存段……哈哈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
  • 1970-01-01
  • 2023-04-06
  • 2012-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多