在 pthread 中运行 shell 命令的良好和优化方法是什么?

What is a good and optimized way to run shell command in a pthread?

本文关键字:优化 方法 是什么 pthread 运行 shell 命令      更新时间:2023-10-16

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

stackoverflow社区有什么建议?

  1. 我可以在线程中使用 system() 吗?

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

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

  1. 你不应该为此使用system,但不是因为它很贵。 (对于任何值得费心压缩的文件,相对于压缩本身的成本,调用后台 gzip 压缩的任何技术的开销都可以忽略不计。 你不应该使用system的原因是,system调用一个shell,这意味着你必须担心引用参数。 如果您改用forkexecvp,则不必担心引用任何内容。

  2. forkwait与线程混合相关的问题是真实的,但它们是可以处理的。 如果您的操作系统有posix_spawn,它将为您解决其中一些问题。 我通常不建议posix_spawn因为使用它的代码通常比使用fork的代码更难维护,但对于此应用程序,它应该没问题。 我无法将forkwait与线程混合到此答案框中的综合指南。

  3. 您应该考虑的另一种方法是使用 zlib 压缩线程中等待gzip进程的数据。 这避免了forkwait与线程混合的问题,但它会向程序添加库依赖项,这可能不如依赖外部gzip可执行文件方便。

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

执行fork/exec或使用zip库的额外复杂性仅在由于某种原因system不足时才值得付出努力(即您希望将子进程的stdinstdout重定向到父进程中,或者您想压缩内存中的文件以通过网络发送它而不写入新文件)。