2011-10-02 36 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,或者如果它,但隊列進行的分配是不是從內部緩衝區取出,指針會在其他進程中無效。