exec()之后的共享内存

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

可以使用mmap吗?

到目前为止,父级和子级都可以使用mmap正确共享内存,但是在执行exec之后不可以

解决方法:

您可以使用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;
}

在这些代码段之后,您可以使用缓冲区访问共享内存. (注意:它不必为空*,您可以使其成为要存储在共享内存中的指针)

上一篇:洛谷P1331海战


下一篇:c-使用不可映射的文件系统测试软件