如果我fork并执行另一个可执行文件,新生成的进程是否能够访问来自父进程的mmap共享的内存。
...
fd = open(filename)
str = mmap (MAP_SHARED, .. fd)
pid = fork();
if(pid == 0) {
exec("executable_2");
}
...
我的问题是,是否可以从这个衍生的executable_2访问(只读)从文件映射的共享内存?
编辑:主要目的是节省读取时间(I / O),因为此文件是只读的。新生成的进程不是调用进程的副本。
答案 0 :(得分:3)
子进程必须重新映射内存才能访问它,但除非共享'否则可以这样做。内存是私下映射的。
这适用于exec*()
的所有形式的共享内存 - 新进程有一个新的独立地址空间,任何共享内存映射必须在执行过程中重新完成。
当然,简单分叉会将共享内存保留为共享内存。但是使用exec*()
为新进程提供了一个干净的地址空间,该地址空间不受以前运行的程序的共享内存的影响。
请注意,由于未使用O_CLOEXEC
打开文件描述符(或者以后未对其进行修改以在其上设置FD_CLOEXEC标志),因此文件描述符在执行的进程中处于打开状态。执行的进程是否知道它的开放性是另一回事 - 它可能不会被执行它的代码告诉它(命令行参数,或者可能是环境变量)。