【问题标题】:using Shmget() in c with structure在具有结构的 c 中使用 Shmget()
【发布时间】:2013-03-20 12:36:56
【问题描述】:

我在 OSx 上使用 C 并使用 shmget() 来获取要在两个不同程序之间使用的内存 i 具有 2 个 int 值的结构 这是否意味着如果我想要一个 27 的大小而不是 54,这将如何与用于结构的指针一起工作或任何帮助将不胜感激

【问题讨论】:

  • 两个int 值的结构通常为8 或16 字节大(取决于您是在32 位还是64 位平台上)。数字 27 和 54 是从哪里来的?
  • 我的 27/54 我忘记了 int 的大小,因为我只看到 shmget 与 char 一起使用

标签: c shared-memory


【解决方案1】:

不,您需要在结构上使用 sizeof。您无法保证实现将如何填充结构内的值,因此您不必假设它们的大小。此外,如果稍后由于向结构添加成员而改变大小,内存分配仍将正常工作。

然后使用 sizeof 中的值乘以您打算在共享内存区域中使用的结构的实例数。

【讨论】:

  • 这是否意味着函数的大小将允许程序增加结构的大小,如果是这样,那将如何完成
  • @Milmar 我不确定我是否正确理解了上面的附加问题。提供一个您目前正在尝试做的事情的例子可能会有所帮助。
  • 所以对于第一个结构位置,我添加以下值 (1,2) 然后我如何到达我知道的下一个内存位置以获取 char 值我可以将指针递增 1 以获得下一个地点
  • 由于您似乎还没有任何代码,您可能想查看这个较早的问题stackoverflow.com/questions/1671336/…,其中包含一些有用的链接和代码示例。事实上,已经存在相当多的共享内存问题。如果你通读它们可能会很有帮助。
【解决方案2】:

假设你有一个这样的结构:

typedef struct {
    int aCount;
    int bCount;
    int cCount;
} data_t;

下面这个函数将创建指定大小的共享内存。

int shared_memory_create(size_t memory_size)
{
    int shm_key = shmget(IPC_PRIVATE, memory_size, IPC_CREAT | IPC_EXCL | 0666);
    if(shm_key < 0) {
        perror("Failed to Create Shared Memory Key");
        exit(0);
    }

    return shm_key;
}

如果要创建共享内存以容纳 27 个元素,请调用函数 shared_memory_create,如下所示:

shm_key = shared_memory_create(27*sizeof(data_t));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-29
    • 2013-02-08
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多