exec() 后的共享内存

shared memory after exec()

如果 child 有 运行 exec(),我如何在 parent 和 child 之间共享内存加载另一个程序?

是否可以使用mmap?

现在 parent 和 child 使用 mmap 正确共享内存,但在 exec 完成后

您可以使用 shm_open 打开一个 "named" 共享内存块,该块由文件系统上的文件标识。例子: 在 parent:

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

How can I share memory between the parent and the child if the child has run exec() to load another program?

既不是通过 mmap() 创建的内存映射,也不是通过 shm_open() 获得的 POSIX shared-memory 段,也不是通过 shmat() 获得的 System V shared-memory 段在执行程序中保留。这涵盖了我所知道的 Linux 提供的所有共享内存形式。

因此,如果您希望 child 在 exec() 之后与 parent 共享内存,那么 child 必须(重新)连接到适当的共享内存记忆之后exec()。显然,这意味着必须编写由 exec() 启动的任何程序来执行此操作。 (特别注意,成功时 exec-family 函数不会 return。)

Is it possible using mmap?

仅当childre-mapsexec()后的内存。

By now parent and child share memory properly using mmap, but not after exec is done

这是设计使然。