复杂类型的 mmap 问题

发布于 2024-12-07 18:58:57 字数 1528 浏览 1 评论 0原文

我在尝试使用复杂类型的 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_structs /c/Queue/Queue.shtml

在我的子进程中,当我这样做时,它会返回正确的值:

printf("Got here... Shared Mem: %d\n", input_queue->consume_remaining);

但是当我执行以下操作时:

IsEmpty(input_queue->buffer)

它会崩溃,并且在队列的代码中它只执行以下操作:

return Q->Size == 0;

任何帮助都会不胜感激,谢谢!!

I have an issue attempting to access shared memory using mmap for complex types.

So I allocate my memory as so in my parent process:

/* 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);
}

Now the Struct that I'm passing in memory to my child process is as follows:

/* Data structue for IPC */
typedef struct {
    int current_active_id;
    int consume_remaining;
    Queue buffer;
} input_buffer;

where Queue is a data structure class from the following:
http://www.idevelopment.info/data/Programming/data_structures/c/Queue/Queue.shtml

In my child process it's okay when I do this, it returns the correct value:

printf("Got here... Shared Mem: %d\n", input_queue->consume_remaining);

but when I do something like:

IsEmpty(input_queue->buffer)

it crashes and in the code of the Queue it's only doing this:

return Q->Size == 0;

Any help would be appreciated, thanks!!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

雨夜星沙 2024-12-14 18:58:57

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

Queue is a pointer to struct QueueRecord, and should be allocated as such, presumably using the same shared memory segment. note that this should also be mapped at the same address in both parent and child, or you will not be able to dereference it.

橘虞初梦 2024-12-14 18:58:57

您放入映射中的结构包含指针。这些指针都与创建它们的进程的地址空间相关。

如果其他进程没有映射到同一地址,或者映射了,但队列的分配不是从该缓冲区内部获取的,则指针在其他进程中将无效。

The structure you are putting in the map contains pointers. The pointers are all relative to the address space of the process that created them.

If the other process doesn't mmap at the same address, or if it does but the allocations made for the queue aren't taken from inside that buffer, the pointers will be invalid in the other process.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文