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
这是设计使然。
如果 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
这是设计使然。