我们正在开发一个用 C++ 编写的多线程内存消耗应用程序。
我们必须执行大量的 shellscript/linux 命令(并获取返回码)。
读完之后article http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them我们清楚地知道在我们的上下文中使用 system() 是一个坏主意。
解决方案是在程序启动之后、创建任何线程之前进行 fork
但与该进程的通信可能并不容易(套接字,管道?)。
我们考虑的第二个解决方案可能包括一个用 python 编写的专用守护进程(使用 xinetd?),它能够处理我们的系统调用。
你有遇到过这样的问题吗?你是怎么解决的?
笔记 :
这是解释此问题的更完整的文章:http://developers.sun.com/solaris/articles/subprocess/subprocess.html http://developers.sun.com/solaris/articles/subprocess/subprocess.html他们建议使用 posix_spawn,它使用 vfork() 而不是 fork()(在 system() 中使用)。
您链接到的文章主要讨论了如果您 fork() 并且不立即使用 exec*() 的问题。由于 system() 通常由 fork() 和 exec() 来实现,因此大多数问题都不适用。不过,确实存在一个问题,那就是关闭文件描述符;除非您有特殊原因要这样做,否则默认情况下使用 O_CLOEXEC 打开文件可能是一个很好的经验法则。
大内存消耗应用程序的 fork()+exec() 的一个问题是,如果您的操作系统配置为不允许内存过量使用,则 fork() 可能会失败。解决此问题的一种方法是在开始在主进程中分配大量内存之前分叉一个“外部进程处理程序”进程。
最好的解决方案是,如果您需要的功能可以作为库提供,那么首先就不需要分叉。不过,短期内这可能不会温暖你的心。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)