我在C中有一个程序,它使用大量内存并运行了很长时间,然后最后它需要调用system()
来调用一个简单的shell命令(它使用很少的内存),但是由于过度使用被禁用(以及缺少交换),由于缺少可用内存,对system()
的此调用可能会失败。
到目前为止,似乎避免内存问题的唯一解决方案是添加一些异步机制,例如在主进程中更早地调用system()
调用,然后让forked进程等待主进程稍后发送数据。这样,分叉进程的内存占用量就小得多。
我错过了什么吗?是否有更简单的方法来调用此外部进程而不会导致内存过量使用问题?我看到了vfork()
的一些提及,但它们似乎暗示它是一种过时的机制。
答案 0 :(得分:2)
在Linux上,vfork()
对fork()
不执行任何操作都不起作用。如果您使用的是Linux,或者在使用写时复制页面实现fork()
的任何其他系统上,则忽略vfork()
的存在(如果有)并仅考虑{{1}为了它的目的。
然而,这对你的问题没有任何好处。事实上,他们会把你带向错误的方向。如果您希望外部命令使用已经为正在运行的程序保留的资源,那么不仅在分叉进程中执行任何操作都会阻止这种情况,但它也会产生轻微的开销。
如果您要执行的外部命令是程序执行的绝对最后事件,那么您可以通过fork()
系列库函数直接启动它,例如作为exec
,没有分支。这些替换它们在启动过程中运行的过程。
如果这不适合您,那么您可以考虑在主程序完成后让外部进程单独运行。将两个命令一起包装在脚本中。