如果孩子已经运行 exec()来加载另一个程序,我如何在父母和孩子之间共享内存?
是否可以使用 mmap ?
到目前为止,父母和孩子使用mmap正确共享内存,但 exec 完成后却没有
答案 0 :(得分:3)
如果孩子,如何在父母和孩子之间共享记忆 运行exec()来加载另一个程序?
通过mmap()
创建的内存映射和通过shm_open()
获得的POSIX共享内存段以及通过shmat()
获得的System V共享内存段都不会在exec中保留。这涵盖了我所知道的Linux提供的所有共享内存形式。
如果您希望孩子在exec()
之后与父母共享内存,那么孩子必须(重新)连接到 {{1}之后的相应共享内存 }。显然,这意味着必须编写exec()
启动的任何程序来执行此操作。 (特别注意,成功时,exec-family函数不会返回。)
是否可以使用mmap?
仅当孩子在exec()
之后重新映射内存。
现在父母和孩子使用mmap正确共享内存,但不是 exec完成后
这是设计的。
答案 1 :(得分:1)
您可以使用shm_open
打开由文件系统上的文件标识的“已命名”共享内存块。例:
在父母:
int memFd = shm_open("example_memory", O_CREAT | O_RDWR, S_IRWXU);
if (memFd == -1)
{
perror("Can't open file");
return 1;
}
int res = ftruncate(memFd, /*size of the memory block you want*/);
if (res == -1)
{
perror("Can't truncate file");
return res;
}
void *buffer = mmap(NULL, /*size of the memory block you want*/, PROT_READ | PROT_WRITE, MAP_SHARED, memFd, 0);
if (buffer == NULL)
{
perror("Can't mmap");
return -1;
}
在另一个档案中:
int memFd = shm_open("example_memory", O_RDONLY, 0);
if (memFd == -1)
{
perror("Can't open file");
return 1;
}
void *buffer = mmap(NULL, /*size of the memory block you want*/, PROT_READ, MAP_SHARED, memFd, 0);
if (buffer == NULL)
{
perror("Can't mmap");
return -1;
}
在这些代码段之后,您可以使用buffer
来访问共享内存。 (注意:它不需要是void*
,你可以将它指向你想要存储在共享内存中的任何内容。