将指针传递给使用exec()生成的进程

时间:2009-03-09 01:19:24

标签: c++ linux gcc exec mmap

我想传递一个指针(我将一个带有mmap的数据存储在内存中的文件)到使用fork + exec生成的进程,但我仍然坚持如何将指针传递给exec()生成的进程? / p>

UPDATE1:

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

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

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

UPDATE2:

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

短代码示例非常感谢。

提前感谢您的帮助。

6 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:1)

这不起作用。新进程也应该mmap文件本身。

答案 2 :(得分:1)

生成的进程可能应该打开一个回到父进程的管道,并询问映射共享内存段所需的数据。

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

找到这些解决方案的关键是搜索Linux inter processor communicationLinux IPC之类的内容。

IPC的介绍也可以在Advance Linux Programming(ISBN:0-7357-1043-0)等书中找到。