我们正在开发一个用C ++编写的多线程内存消耗应用程序。 我们必须执行大量的shellcript / linux命令(并获取返回代码)。
在阅读article之后,我们清楚地了解在我们的上下文中使用system()是一个坏主意。
解决方案是在程序启动之后和创建任何线程之前进行分支 但与那个过程的沟通可能并不容易(套接字,管道?)。
我们考虑的第二个解决方案可能包括一个用python编写的专用守护程序(使用xinetd?),它可以处理我们的系统调用。
你有过这个问题吗?你是怎么解决的?注意: 这是一篇更完整的文章,解释了这个问题:http://developers.sun.com/solaris/articles/subprocess/subprocess.html 他们建议使用posix_spawn,它使用vfork()而不是fork()(在system()中使用)。
答案 0 :(得分:2)
你链接到的文章主要讨论问题,如果你fork()并且没有立即跟随exec *()。由于system()通常由fork()后跟exec()实现,因此大多数问题都不适用。一个适用的问题是关于关闭文件描述符的问题;除非您有特殊原因要做,否则默认情况下使用O_CLOEXEC打开文件可能是一个很好的经验法则。
大型内存消耗应用程序的fork()+ exec()的一个问题是,如果您的操作系统配置为不允许内存过量使用,fork()可能会失败。对此的一个解决方案是在开始在主进程中分配大量内存之前分叉“外部进程处理程序”进程。
最好的解决方案是,如果您需要的功能可用作库,则无需首先进行分叉。不过,这可能不会在短期内温暖你的心。
答案 1 :(得分:0)
你会得到如何你应该调用外部程序(fork / exec / wait,等等)的问题,但这只是问题的一部分。真正的问题是这个的安排,我想,你不想并行运行太多的外部程序。
在不知道线程组织如何进入您的系统的情况下,我可以提醒您两个问题。
一个重要的问题是通过限制外部命令/脚本调用来保持低负载。您可以设置一个参数,该参数告诉您应该同时运行多少并行外部命令。在调用外部命令之前,应该增加一个显示活动外部进程数的变量;如果超过limit参数,请睡眠(),然后再试一次。完成该过程后,减少该变量。 (增加和减少必须是互斥的。)
另一个问题是,当您使用外部程序时,管理其生命周期。您应该为每个外部进程设置一个“超时”,如果它暂停一段时间就将其终止。应该有一个“超时”线程(或应该是主线程),它控制其他线程。
答案 2 :(得分:0)
这个解决方案怎么样:
fork()在程序的最开始,让孩子专注于启动和管理您的外部程序。然后让父启动它的所有线程并执行应用程序逻辑,在需要外部进程时通过管道发送请求。
这可以在启动它们之前解决线程问题。