【发布时间】:2011-10-02 12:55:25
【问题描述】:
我在尝试使用 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;
其中 Queue 是来自以下的数据结构类: 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->buffer 不是子进程中的有效内存地址。你在这里做IPC怎么样?您需要在子进程中映射相同的“共享”文件以执行 IPC。
-
我基本上启动子进程并创建另一个 mmap_ptr 并将其转换为 input_queue 类型。这适用于基本类型的 int,但不适用于指向队列的指针。我将如何分配队列数据结构以成为共享内存的一部分?