如果我使用 exec 生成另一个进程,它可以访问使用 mmap 映射的共享内存吗?

If I spawn another process using exec, can it access shared memory mapped using mmap?

如果我 fork 并执行另一个可执行文件,新生成的进程是否能够访问父进程通过 mmap 共享的内存。

...

fd = open(filename)
str = mmap (MAP_SHARED, .. fd)
pid = fork();
if(pid == 0) {
    exec("executable_2");
}

.....

我的问题是,是否可以从这个生成的 executable_2 访问(只读)从文件映射的共享内存?

编辑:主要目的是节省阅读时间(I/O),因为该文件是只读的。新生成的进程不是调用进程的副本。

子进程必须重新映射内存才能访问它,但可以这样做,除非 'shared' 内存是私有映射的。

这将适用于 exec*() 中所有形式的共享内存 — 新进程有一个新的独立地址 space 并且任何共享内存映射都必须在已执行的进程中重新完成。

简单的fork,当然是把shared memory留作shared memory。但是使用 exec*() 为新进程提供了一个干净的地址 space,它没有像以前那样被程序的共享内存污染 运行。

请注意,由于文件描述符未使用 O_CLOEXEC 打开(或稍后未修改以在其上设置 FD_CLOEXEC 标志),文件描述符在执行的进程中打开。执行的进程是否知道它打开的目的完全是另一回事——它可能不知道,除非它被执行它的代码告知(命令行参数,或者可能是环境变量)。