首页 > 解决方案 > 从现有共享内存区域分配指针 - POSIX C API

问题描述

我有一个如下所述形式的结构 A。我的目标是在一个流程中创建结构并将其共享到不同的流程。A->buffer 取决于提供的 user_size 和 value,因此我不能有预分配的缓冲区。知道与共享内存共享指针很难跨进程,因为一个进程中的指针值在另一个进程中将不再有效,我尝试了以下方法。

我想从共享内存中分配缓冲区,从写入进程,以便其他进程可以映射到同一个共享内存并获得指向共享内存的有效指针地址。

从概念上讲,在同一个共享内存 fd 描述符上调用 mmap 应该指向共享内存中的相同位置,但是在读取过程中,我能够获得一个有效的指针和有效的 another_value。

有人可以澄清一下吗?部分代码如下。

struct A {

 int another_variable;
 void *buffer;
}

/* the size (in bytes) of shared memory object */
const int SIZE = 4096;

/* name of the shared memory object */
const char *name = "OS";

/* shared memory file descriptor */
int shm_fd;

/* create the shared memory object */
shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666);

/* configure the size of the shared memory object */
ftruncate(shm_fd, SIZE);

a_data = mmap(NULL, sizeof(*A), PROT_READ | PROT_WRITE, MAP_SHARED,
        shm_fd, 0);


if (a_data == MAP_FAILED) {
    printf("ERROR: mmap failed for a_data\n");
    exit(EXIT_FAILURE);
}

a_data->buffer = mmap(NULL, user_size,  PROT_WRITE,
            MAP_SHARED , shm_fd, 0);

if (a_data->buffer == MAP_FAILED) {
    printf("ERROR: mmap failed for a_data buffer\n");
    exit(EXIT_FAILURE);
}

memcpy(a_data->buffer, "test", strlen("test"));

标签: cposixipcshared-memory

解决方案


推荐阅读