【发布时间】:2016-03-02 21:55:05
【问题描述】:
我正在编写一项服务(即后台进程),并希望通过共享库启动它。也就是说,想要使用该服务的人会链接到共享库,调用它的 start() 方法,该方法将分叉并返回。然后,fork 将运行该服务。
这种方法的问题是服务进程现在可能有很多它实际上不需要的遗留分配内存。有没有办法摆脱它并让分叉的进程分配自己的东西?我当然知道 exec(),但问题是
- 我需要一个可执行文件,但由于操作系统文件夹布局不同,它可能不在我预期的位置
- 我必须将所有潜在参数转换为字符串,以将其作为程序参数传递给 exec()。
所以基本上,我正在寻找一种方法来调用任意函数 func() 带有一些应该在新进程中运行的参数,并且不应该传递给该函数的所有内容在新的过程中。有没有办法实现这个或类似的东西?
【问题讨论】:
-
这通常是不必要的,因为 Linux 使用写时复制 fork 实现,以便父子共享“复制”内存,直到子修改它。
-
你想要的并不真正可行。例如,假设库使用 stdio,并且 stdio 有一些分配的内存,你不希望你的“释放所有分配的内存”来释放它。所以你真正想要的是“释放所有不再需要的东西”,但是一个通用的函数怎么能知道什么是不需要的呢?
-
@RossRidge 但是您想删除对副本的引用,因此当父级退出时它会全部消失。
-
@RossRidge 当父母或孩子修改它时它变得不共享。在极端情况下,父级继续修改所有内容而子级只做自己的事情,您最终会得到父级在调用
fork之前分配的每一页内存的副本。 -
@DavidSchwartz 这样做的问题是您将执行库的客户端程序,而不是库的服务器可执行文件。
标签: c++ c linux memory-management fork