繁体   English   中英

如果我使用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),因为此文件是只读的。 新生成的进程不是调用进程的副本。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM