从多线程程序调用 system()

标签 c linux pthreads system fork

我们正在开发一个用 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/

相关文章:

linux - 当没有 Internet 连接时,如何将扩展安装到作为 Remote-SSH 远程端的 VS Code 服务器中?

c - 如何在不阻塞的情况下检查线程是否完成?

c++ - 给信号量一个id

c - Valgrind 检查 C 中的内存泄漏

C 编程错误处理

创建具有不同调度优先级的线程

c - 创建和销毁线程时内存泄漏

c - 为什么插入到列表中需要一个指向指针的指针

C程序以最短的执行时间减少大量数字

linux - 哪个 Node 指向usr/bin/node,cd usr/bin/node不存在