【问题标题】:Issues with mmap of Complex Types复杂类型的 mmap 问题
【发布时间】:2011-10-02 12:55:25
【问题描述】:

我在尝试使用 mmap 访问复杂类型的共享内存时遇到问题。

所以我在父进程中分配内存:

/* Create mmap file */
fid = open(TMP_FILE_NAME, O_RDWR | O_CREAT | O_EXCL, (mode_t) 0755);
if (fid < 0)
{
  printf("Bad Open of mmap file <%s>\n", TMP_FILE_NAME);
  die(-1);
}

/* Make mmap file Buffer Size */
status = ftruncate(fid, INPUT_BUFFER_SIZE); 
if (status)
{
    printf("Failed to ftruncate the file <%s>, status = %d\n", TMP_FILE_NAME, status);
    die(-1);
}

/* Initialize Shared Memory */
mmap_ptr = mmap((caddr_t) 0,
      INPUT_BUFFER_SIZE,        // Default Buffer Size
      PROT_WRITE | PROT_READ,   // R/W Permissions
      MAP_SHARED, // No file backing
      fid,  
      (off_t) 0);
if (mmap_ptr == MAP_FAILED)
{
    printf("Failed to perform mmap, Exiting\n");
    die(-1);
}

现在我在内存中传递给子进程的结构如下:

/* Data structue for IPC */
typedef struct {
    int current_active_id;
    int consume_remaining;
    Queue buffer;
} input_buffer;

其中 Queue 是来自以下的数据结构类: http://www.idevelopment.info/data/Programming/data_structures/c/Queue/Queue.shtml

在我的子进程中,我这样做没问题,它返回正确的值:

printf("Got here... Shared Mem: %d\n", input_queue->consume_remaining);

但是当我做类似的事情时:

IsEmpty(input_queue->buffer)

它崩溃并且在队列的代码中它只是这样做:

return Q->Size == 0;

任何帮助将不胜感激,谢谢!

【问题讨论】:

  • input_queue->buffer 不是子进程中的有效内存地址。你在这里做IPC怎么样?您需要在子进程中映射相同的“共享”文件以执行 IPC。
  • 我基本上启动子进程并创建另一个 mmap_ptr 并将其转换为 input_queue 类型。这适用于基本类型的 int,但不适用于指向队列的指针。我将如何分配队列数据结构以成为共享内存的一部分?

标签: c memory shared mmap


【解决方案1】:

Queue 是一个指向struct QueueRecord 的指针,应该这样分配,大概是使用相同的共享内存段。请注意,这也应该在父子节点中映射到相同的地址,否则您将无法取消引用它。

【讨论】:

  • 好吧,我明白了。所以在idevelopment.info/data/Programming/data_structures/c/Queue/…而不是malloc,我会做一个mmap?
  • 或者更清楚地说,我如何将它分配到与我映射的结构相同的地址区域?
  • @JKao:您可以更改代码,使您的映射区域包含struct QueueRecord,可以对其进行修改,使其具有灵活的成员以用作数组,而不是使用分配的指针。请注意,当前的实现隐藏了结构的定义。
【解决方案2】:

您放入地图的结构包含指针。指针都是相对于创建它们的进程的地址空间。

如果另一个进程没有映射到相同的地址,或者如果它映射了但为队列所做的分配不是从该缓冲区内获取的,则指针在另一个进程中将无效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    相关资源
    最近更新 更多