Linux:来自内存密集型进程的system(),无需分叉
Linux: system() from a memory-intensive process without forking
我在 60 GB Linux 机器上有一个大的C++进程(35+ GB RAM 使用),需要 system() 来执行一些功能。但是,由于 system() 在内部分叉并执行新进程,因此它需要的虚拟内存空间是原始进程 RAM 的两倍。
我知道我可以使用 sysctl 始终启用过载内存,从而允许我的进程分叉。但是,是否有 system() 的替代方案可以在不需要太多虚拟内存的情况下执行新进程?
如果您的实现包含 posix_spawn(),这是一个更可行的替代方案。
#include <spawn.h>
http://fixunix.com/unix/84486-difference-between-spawn-fork.html
创建第二个较小的进程,该进程仅接收命令并执行命令。
选择您喜欢的IPC(套接字,管道,信号,消息队列,选择您喜欢的IPC),并在需要执行一些小的系统操作时从庞大的进程中挠痒痒。
我们最终选择了 FB 愚蠢库中的 Subprocess,因为我们最近无论如何都添加了 folly 作为依赖项。他们在引擎盖下使用vfork()
,在不复制进程页面的情况下分叉进程,并冻结父进程,直到子 exec() 的。
vfork()
有许多潜在的陷阱,似乎被广泛认为已弃用/使用起来很危险。例如,它要求分叉进程只执行 exec 以外的任何操作;由于进程的页面是共享的,因此如果修改了任何内存,它们可能会修改和损坏父进程的状态。在精心编程的库中抽象它应该可以更容易地避免错误,当我们只是想在没有内存开销的情况下启动一个进程时。
愚蠢子进程库的标头:https://github.com/facebook/folly/blob/master/folly/Subprocess.h
- 如何在c++中使用system()来运行包含空格的python脚本
- System.InvalidCastException - SQL to C++ - safe_cast<float>
- C++/CLI System.AccessViolation在托管类中调用非托管函数时出现异常
- 来自 Android 应用程序内部的 boost 类型的 boost::wrapexcept<boost::system::system_error> 的未捕获异常
- 程序在使用 system() 启动另一个可执行文件时停止
- 为什么我的 DeviceInformation 对象没有 System.Devices.InterfaceClassGuid 属性?
- 为什么"using System;"不被视为不良做法?
- C++ 合并字符串以'system'函数错误
- System.AccessViolationException:shared_ptr C# .NET 和 C++ 应用程
- 将 Vcl::Controls::TCaption aka (System::UnicodeString) 转换为 co
- 对 boost::system::d etail::system_category_instance 的未定义引用,从
- Python os.system() 返回错误值
- 使用 system() 函数在C++程序中运行 cmd 命令
- 如何使用 C/C++ 和 system() 系统调用以外的其他方法在 Linux 中获取文件功能?
- 在C++中,如何在第一个"system()"结束后执行第二个"system()"?
- system() 无法运行我的程序,因为空间
- How to recover system gcc compiler on centos 6
- 导出 c++ 函数并使用 c# System.AccessViolationException 中的函数
- g++ 中的 system() 函数
- Linux:来自内存密集型进程的system(),无需分叉