如何将多个结构实例存储在共享内存中?

时间:2015-01-23 15:53:57

标签: c unix posix shared-memory

我有一个结构定义如下

struct s
{
int a;
};
struct s s1;
struct s s2;

我需要将两个结构实例都推送到共享内存。

char *data=(char *)shmat(m_sharedMemoryId,NULL,0);
memcpy(data,&s1,sizeof struct s);

我做了第一个结构实例。

如何处理第二个实例?这可能在共享内存中吗?

Plaftform:UNIX

1 个答案:

答案 0 :(得分:2)

shmat调用只获取一个指针,该指针指向之前应该使用shmget创建的共享内存段。你有2种方法可以解决这个问题:

  • 分配一个段,该段将包含所有结构的数组,然后将结构复制到此数组:

    m_sharedMemoryId = shmget(key, sizeof(struct s) * nb, perm_flag);
    struct s* data = shmat(m_sharedMemoryId,NULL,0);
    

    然后你在数组中复制一个你想要的结构,这里位于i:

    memcpy(data + i,&s1,sizeof(struct s));
    

    如果你有很多小结构,这主要是用来

  • 为每个结构分配不同的段

    m_sharedMemoryId = shmget(key, sizeof(struct s), perm_flag);
    struct s* data = shmat(m_sharedMemoryId,NULL,0);
    memcpy(data,&s1,sizeof(struct s));
    

    并重复每个结构的分配。如果您希望能够单独解除分配的几个大结构,则使用此方法