C 复杂类型的mmap问题

C 复杂类型的mmap问题,c,memory,shared,mmap,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 Buf

我在尝试使用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);
}
其中,Queue是来自以下项的数据结构类:

在我的子进程中,当我这样做时,它会返回正确的值:

printf("Got here... Shared Mem: %d\n", input_queue->consume_remaining);
但是当我做一些类似的事情时:

IsEmpty(input_queue->buffer)
它崩溃了,在队列的代码中,它只执行以下操作:

return Q->Size == 0;

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

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

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

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


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

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


如果另一个进程不在同一地址进行mmap,或者如果它在同一地址进行mmap,但是为队列所做的分配不是从该缓冲区中获取的,那么指针在另一个进程中将无效。

好的,我认为这是有意义的。因此,在替代malloc的情况下,我将执行mmap?或者更清楚地说,我将如何将其malloc到与结构I mmap'ed相同的地址区域?@JKao:您可以更改代码,使您的映射区域包含一个
struct QueueRecord
,该区域可以修改为有一个灵活的成员用作数组,而不是使用分配的指针。请注意,尽管当前的实现隐藏了结构的定义。好的,我认为这是有意义的。因此,在替代malloc的情况下,我将执行mmap?或者更清楚地说,我将如何将其malloc到与结构I mmap'ed相同的地址区域?@JKao:您可以更改代码,使您的映射区域包含一个
struct QueueRecord
,该区域可以修改为有一个灵活的成员用作数组,而不是使用分配的指针。但是请注意,当前实现隐藏了struct的定义。input_queue->buffer在子进程中不是有效的内存地址。你在这儿过得怎么样?您需要在子进程中映射相同的“共享”文件以执行IPC。我基本上启动子进程并创建另一个mmap_ptr,并将其转换为输入_队列类型。这适用于int的基本类型,但不适用于指向队列的指针。如何分配队列数据结构作为共享mem的一部分?input_queue->buffer在子进程中不是有效的内存地址。你在这儿过得怎么样?您需要在子进程中映射相同的“共享”文件以执行IPC。我基本上启动子进程并创建另一个mmap_ptr,并将其转换为输入_队列类型。这适用于int的基本类型,但不适用于指向队列的指针。我将如何分配队列数据结构作为共享mem的一部分?
return Q->Size == 0;