如果 child 已经运行 exec()来加载另一个程序,那么我如何在 parent 和 child 之间共享内存?
是否可以使用 mmap ?
到目前为止, parent 和 child 都可以使用mmap正确共享内存,但是在 exec 完成之后还没有
最佳答案
您可以使用shm_open
打开“命名”共享内存块,该文件块由文件系统上的文件标识。例:
在 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*
,您可以使其成为指向您打算存储在共享内存中的任何内容的指针)