C - exec() 之后的共享内存



如果子级运行了exec()来加载另一个程序,如何在父级和子级之间共享内存?

可以使用mmap吗?

到目前为止,父级和子级使用 mmap 正确共享内存,但在exec完成后不会

如果孩子,我如何在父级和子级之间共享内存 是否运行了 exec() 来加载另一个程序?

通过mmap()创建的内存映射、通过shm_open()获得的 POSIX 共享内存段以及通过shmat()获得的系统 V 共享内存段都不会保留在执行器中。 这涵盖了我知道Linux提供的所有形式的共享内存。

因此,如果您希望子级在exec()后与父级共享内存,则子项必须在exec()(重新)连接到相应的共享内存。 显然,这意味着无论exec()启动什么程序,都必须编写来做到这一点。 (特别要注意的是,在成功时,exec-family函数不会返回。

可以使用mmap吗?

仅当孩子在exec()后重新映射内存时。

到目前为止,父级和子级使用 mmap 正确共享内存,但不能 执行完成后

这是设计使然。

您可以使用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*,你可以让它成为指向你打算存储在共享mem中的任何内容的指针)

最新更新