C 复杂类型的mmap问题
我在尝试使用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
/* 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;