在pthread中运行shell命令的一种最佳且经过优化的方法是什么?

时间:2019-02-14 15:04:07

标签: c++ pthreads posix freebsd

基本上,我想使用gzip在pthread线程中压缩文件。 在脑海中和Google上出现的第一个解决方案是调用system()。

stackoverflow社区有何建议?

  1. 我应该在pthread中使用system()吗?

  2. 还是我自己应该在pthread中分叉并执行?但是,由于pthread是线程,是否建议在pthread线程中进行fork()和exec()?

  3. 或者什么是比上述更好的方法?

2 个答案:

答案 0 :(得分:2)

从另一个线程中的system调用开始,仅在需要时增加复杂性。

仅当fork由于某些原因(例如,您想将子进程的execzip都重定向到您的父进程,或者您想压缩内存中的文件以通过网络发送它而无需写入新文件)。

答案 1 :(得分:2)

  1. 您不应为此使用system,但不要这样做,因为它很昂贵。 (对于任何值得压缩的文件, any 调用背景gzip压缩的技术开销相对于压缩本身的成本而言是可以忽略的。)不应使用{ {1}}是system调用外壳程序,这意味着您必须担心引用参数。如果您改用systemfork,则不必担心引用任何内容。

  2. execvpfork与线程混合相关的问题是真实的,但是很容易解决。如果您的操作系统有wait,它将为您解决其中的一些问题。我通常不建议使用posix_spawn,因为使用它的代码通常比使用posix_spawn的代码更难维护,但是对于此应用程序来说应该可以。我不适合将forkfork与线程混合到此答案框中的全面指南。

  3. 您应该考虑的替代方法是使用zlib在等待wait进程的线程中压缩数据。这样可以避免将gzipfork与线程混合的问题,但是它为您的程序增加了库依赖,这可能不像依赖外部wait可执行文件那样方便。