如果我使用 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 标志),文件描述符在执行的进程中打开。执行的进程是否知道它打开的目的完全是另一回事——它可能不知道,除非它被执行它的代码告知(命令行参数,或者可能是环境变量)。
如果我 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 标志),文件描述符在执行的进程中打开。执行的进程是否知道它打开的目的完全是另一回事——它可能不知道,除非它被执行它的代码告知(命令行参数,或者可能是环境变量)。