c - 从现有共享内存区域分配指针 - 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"));
解决方案
推荐阅读
- checkbox - 基于复选框的加减值
- elasticsearch - 锚标记替换模式到标记的末尾
- neo4j - Neo4J 编写密码查询的正确方法
- weblogic12c - Weblogic 12.1.3 到 12.2.1 升级
- ios - 将 UIView 的掩码与多个其他视图一起使用
- angular - 上传和预览 GLTF 文件 (3D)
- c# - Is there a alternative to get .NET that doesn't need admin password?
- python - Is there a way to use multiprocessing in a user defined class on another user defined class to modify one of its attributes in place?
- javascript - on click increase height and width of div also get content inside it using ajax
- java - What'd be the synthetically correct way of imitating extendable enum behavior?