我有一個問題,試圖訪問使用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;
任何幫助,將不勝感激,謝謝! !
input_queue->緩衝區不在子進程一個有效的內存地址。你在這裏做IPC怎麼樣?您需要在子進程中映射相同的「共享」文件才能執行IPC。 – Finslicer
我基本上啓動子進程並創建另一個mmap_ptr並將其轉換爲input_queue類型。這適用於int的基本類型,但不適用於隊列指針。我將如何去分配隊列數據結構成爲共享mem的一部分? –