Linux:系统()从一个内存密集型的过程没有分叉

我在60 GB的Linux机器上有一个很大的C ++进程(35+ GB的RAM使用),需要system()来执行一些function。 但是,因为system()内部分叉并执行新进程,所以需要虚拟内存空间,这是原始进程RAM的两倍。

我明白,我可以使用sysctl总是启用overcommitting内存,从而使我的过程分叉。 但是,是否有一个可以执行新进程而不需要太多虚拟内存的system()的替代方法?

如果你的实现包含posix_spawn(),这是一个更可行的选择。

#include <spawn.h> 

http://fixunix.com/unix/84486-difference-between-spawn-fork.html

创建第二个较小的进程,只接收命令并对其进行修改。

选择你最喜欢的IPC(socket,pipe,signal,msg队列,选择你最喜欢的IPC),当你需要执行一些小的系统操作时,从你的巨大进程中剔除这个进程。

我们最终使用FB愚蠢库中的Subprocess,因为我们最近添加了愚蠢作为依赖。 他们在vfork()使用了vfork() ,这个过程没有复制进程的页面,而是冻结了父进程,直到子进程exec()。

vfork()有许多潜在的缺陷,似乎被广泛认为是过时的/危险的使用。 例如,它要求分支进程除exec之外什么也不做; 因为进程的页面是共享的,所以如果修改了内存,他们可以修改和破坏父进程的状态。 把它在一个精心编程的库中抽象出来,当我们简单地想要启动一个没有内存开销的进程时,应该可以更容易地避免错误。

愚蠢Subprocess库头: https : //github.com/facebook/folly/blob/master/folly/Subprocess.h