fork() 并释放所有分配的内存
fork() and free all allocated memory
我正在编写一项服务(即后台进程)并希望通过共享库启动它。也就是说,想要使用该服务的人会 link 到共享库,调用它的 start() 方法,这将 fork 和 return。然后叉子将 运行 服务。
这种方法的问题是服务进程现在可能有很多它实际上不需要的遗留分配内存。有没有办法摆脱它并让分叉进程分配自己的东西?我当然知道 exec(),但问题是
- 我需要一个可执行文件,由于不同的操作系统文件夹布局,它可能不在我期望的位置
- 我必须将所有潜在参数转换为字符串,才能将其作为程序参数传递给 exec().
所以基本上,我正在寻找一种方法来调用任意函数 func(),其中一些参数应该 运行 在新进程中,以及所有内容未传递给该函数的不应该在新进程中。有没有办法实现这个或类似的东西?
这是一个有趣的问题,遗憾的是我没有很好的答案。我怀疑像 sbrk+close+munmap 这样的任何清理策略是否会可靠地允许任何基于 libc 的代码继续运行,所以我会尝试让 exec'ing 更好:
对于任何一种基于 exec 的解决方案,您应该能够将数据深度复制到 shm 中以传递非字符串。这应该可以解决您的第二个问题。
这里有一些针对您的第一期的疯狂建议:
不要:只要求可执行文件位于 PATH 或编译时目录中。
这是透明的并且遵循 UNIX 哲学。错误消息 Can't find myhelper in PATH
不会减慢任何人的速度。大多数依赖帮助程序可执行文件的工具都这样做,而且很好。
Make your library executable,并将其用作您的执行目标。您可以尝试通过某种内省找到它的名称,也许是 /proc/self/maps
或 glibc 提供的任何名称。
像上面一样,但是 exec python
或你可以合理确定的东西存在,并使用外部指针接口 运行 你库中的一个函数。
作为构建过程的一部分,编译一个小型可执行文件并将其作为二进制数据包含在您的库中。写入/tmp
并执行。
其中,我更喜欢 #1 的简单性和透明性,即使那是最无聊的解决方案。
我正在编写一项服务(即后台进程)并希望通过共享库启动它。也就是说,想要使用该服务的人会 link 到共享库,调用它的 start() 方法,这将 fork 和 return。然后叉子将 运行 服务。
这种方法的问题是服务进程现在可能有很多它实际上不需要的遗留分配内存。有没有办法摆脱它并让分叉进程分配自己的东西?我当然知道 exec(),但问题是
- 我需要一个可执行文件,由于不同的操作系统文件夹布局,它可能不在我期望的位置
- 我必须将所有潜在参数转换为字符串,才能将其作为程序参数传递给 exec().
所以基本上,我正在寻找一种方法来调用任意函数 func(),其中一些参数应该 运行 在新进程中,以及所有内容未传递给该函数的不应该在新进程中。有没有办法实现这个或类似的东西?
这是一个有趣的问题,遗憾的是我没有很好的答案。我怀疑像 sbrk+close+munmap 这样的任何清理策略是否会可靠地允许任何基于 libc 的代码继续运行,所以我会尝试让 exec'ing 更好:
对于任何一种基于 exec 的解决方案,您应该能够将数据深度复制到 shm 中以传递非字符串。这应该可以解决您的第二个问题。
这里有一些针对您的第一期的疯狂建议:
不要:只要求可执行文件位于 PATH 或编译时目录中。
这是透明的并且遵循 UNIX 哲学。错误消息
Can't find myhelper in PATH
不会减慢任何人的速度。大多数依赖帮助程序可执行文件的工具都这样做,而且很好。Make your library executable,并将其用作您的执行目标。您可以尝试通过某种内省找到它的名称,也许是
/proc/self/maps
或 glibc 提供的任何名称。像上面一样,但是 exec
python
或你可以合理确定的东西存在,并使用外部指针接口 运行 你库中的一个函数。作为构建过程的一部分,编译一个小型可执行文件并将其作为二进制数据包含在您的库中。写入
/tmp
并执行。
其中,我更喜欢 #1 的简单性和透明性,即使那是最无聊的解决方案。