2011-10-02 83 views
0

我有一个问题,试图访问使用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; 

其中队列是从以下的数据结构类: 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; 

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

+0

input_queue->缓冲区不在子进程一个有效的内存地址。你在这里做IPC怎么样?您需要在子进程中映射相同的“共享”文件才能执行IPC。 – Finslicer

+0

我基本上启动子进程并创建另一个mmap_ptr并将其转换为input_queue类型。这适用于int的基本类型,但不适用于队列指针。我将如何去分配队列数据结构成为共享mem的一部分? –

回答

2

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

+0

好的,我明白这是有道理的。所以在http://www.idevelopment.info/data/Programming/data_structures/c/Queue/queue.c而不是malloc,我会做一个mmap? –

+0

或者更清楚一点,我将如何将它与malloc映射到同一个地址区域? –

+0

@JKao:你可以更改代码,以便您的映射区域包含'结构QueueRecord',这可以被修改成具有用作阵列的柔性构件,而不是使用分配的指针。但请注意,当前实现隐藏了结构的定义。 – Hasturkun

1

你在地图上是把该结构包含指针。指针都是相对于创建它们的进程的地址空间的。

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