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

标签 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),因为该文件是只读的。新生成的进程不是调用进程的副本。

最佳答案

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

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

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

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

关于c - 如果我使用 exec 生成另一个进程,它可以访问使用 mmap 映射的共享内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32257191/

相关文章:

PHP Exec : Without Waiting, 没有丢弃输出,没有 nohup

调用 exec() 或 spawn(P_OVERLAY) 解锁控制台;有什么方法可以阻止控制台?

c++ - 我如何告诉 wc 停止阅读?

c - char *token[32] 和 char token[32] 的区别

android - 无法使用runtime.exec重新启动设备

c++ - 在库中包含具有外部 C 链接的函数

fork - 并行进程的数量将如何影响 CPU 的性能?

c++ - fork 后内存损坏

c - Linux-使用pthread强制执行单核并调试多线程

c - pthread_cond_signal 和可能的线程饥饿