1

我想向使用 fork + exec 生成的进程传递一个指针(我正在使用 mmap 将一个包含数据的文件放入内存中),但我被困在如何将指针传递给 exec() 生成的进程?

更新1:

感谢您的输入,我确实使用共享内存使用带有 MAP_INHERIT 标志的 mmap 创建它:

使用 mmap() 函数创建的每个映射文件和共享内存区域都会通过成功调用任何 exec 函数来取消映射,使用 MAP_INHERIT 选项映射的区域除外。使用 MAP_INHERIT 选项映射的区域仍然映射在新的过程映像中。

来源:http ://www.uwm.edu/cgi-bin/IMT/wwwman?topic=exec(2)&msection=

更新2:

这是家庭作业练习,但我认为我必须停止考虑指针并考虑 IPC 本身。我想我会尝试在子进程中映射同一个文件。

非常感谢短代码示例。

在此先感谢您的帮助。

4

6 回答 6

9

如果使用共享内存,则无法传递指针。指针将包含虚拟地址,该地址与一个进程不同。您必须根据共享内存区域的开始交换偏移值。

如果您不使用共享内存,则无法交换任何类型的指针:其他进程将无法访问您进程的内存。

于 2009-03-09T01:22:53.960 回答
1

这是行不通的。新进程也应该mmap是文件本身。

于 2009-03-09T01:22:07.130 回答
1

生成的进程可能应该打开一个返回父进程的管道,并请求它需要映射共享内存段的数据。

或者,您可以使用 boost::interprocess 为您创建一个共享内存段并实际传递地址(它可以进行映射)。不过,您自己阅读该文档:http: //www.boost.org/doc/libs/1_38_0/doc/html/interprocess.html

于 2009-03-09T01:32:46.340 回答
1

考虑将文件内内存的偏移量传递给子进程。如果偏移量为零,则不要打扰,但是如果您需要传递一个“指针”以部分通过文件,则将其转换为从起始地址开始的偏移量,并将其传递给子级。然后,孩子可以通过将偏移量添加到它为映射文件获得的地址来获取数据。

于 2009-03-09T02:39:19.253 回答
0

只需在命令行参数或环境变量中作为文本传递。

于 2009-03-09T01:21:14.493 回答
0

这是一个很大的区域,你有很多选择。

找到这些解决方案的关键是搜索诸如Linux 处理器间通信Linux IPC之类的东西。

IPC 简介也可以在诸如 Advance Linux Programming (ISBN: 0-7357-1043-0) 等书籍中找到

于 2009-03-18T07:02:12.763 回答