复杂类型的mmap问题

时间:2011-10-02 12:55:26

标签: c memory shared mmap

我尝试使用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)

它崩溃了,在Queue的代码中它只是这样做:

return Q->Size == 0;

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

如果其他进程没有在同一地址进行mmap,或者如果没有mmap,但是没有从该缓冲区内部获取队列的分配,则指针在其他进程中将无效。