exec()后共享内存

时间:2018-01-10 15:24:35

标签: c linux fork exec mmap

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

是否可以使用 mmap

到目前为止,父母和孩子使用mmap正确共享内存,但 exec 完成后却没有

2 个答案:

答案 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*,你可以将它指向你想要存储在共享内存中的任何内容。