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

时间:2015-08-27 18:45:37

标签: c exec fork shared mmap

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

...

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

...

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

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

1 个答案:

答案 0 :(得分:3)

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

这适用于exec*()的所有形式的共享内存 - 新进程有一个新的独立地址空间,任何共享内存映射必须在执行过程中重新完成。

当然,简单分叉会将共享内存保留为共享内存。但是使用exec*()为新进程提供了一个干净的地址空间,该地址空间不受以前运行的程序的共享内存的影响。

请注意,由于未使用O_CLOEXEC打开文件描述符(或者以后未对其进行修改以在其上设置FD_CLOEXEC标志),因此文件描述符在执行的进程中处于打开状态。执行的进程是否知道它的开放性是另一回事 - 它可能不会被执行它的代码告诉它(命令行参数,或者可能是环境变量)。