我们正在开发一个用 C++ 编写的多线程内存消耗应用程序。 我们必须执行大量的 shellscript/linux 命令(并获取返回码)。
看完之后 article我们清楚地知道在我们的上下文中使用 system() 是一个坏主意。
一个解决方案是在程序启动之后和创建任何线程之前进行 fork 但与该进程的通信可能并不容易(套接字、管道?)。
我们考虑的第二个解决方案可能包括一个用 python 编写的专用守护进程(使用 xinetd?),它能够处理我们的系统调用。
你遇到过这样的问题吗?你是怎么解决的?
注意: 这是解释此问题的更完整的文章:http://developers.sun.com/solaris/articles/subprocess/subprocess.html 他们建议使用 posix_spawn,它使用 vfork() 而不是 fork()(在 system() 中使用)。
最佳答案
如果您 fork() 并且不立即使用 exec*() 跟随它,您链接到的文章主要讨论问题。由于 system() 通常由 fork() 后跟 exec() 实现,所以大多数问题都不适用。不过,一个确实适用的问题是关于关闭文件描述符的要点;除非您有特殊原因不这样做,否则默认情况下使用 O_CLOEXEC 打开文件可能是一个很好的经验法则。
大内存消耗应用程序的 fork()+exec() 的一个问题是,如果您的操作系统配置为不允许内存过量使用,则 fork() 可能会失败。一种解决方案是在您开始在主进程中分配大量内存之前 fork 一个“外部进程处理程序”进程。
最好的解决方案是,如果您需要的功能可以作为一个库使用,那么首先就不需要 fork 。不过,这在短期内可能不会让您心动。
关于从多线程程序调用 system(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8574815/