基本上,我想使用gzip在pthread线程中压缩文件。弹出的第一个解决方案就是调用system()。
stackoverflow社区建议什么?
system
,但不是因为它很贵。 (对于任何值得压缩的文件,调用背景gzip压缩的任何技术的开销相对于执行压缩本身的成本可以忽略不计。)你不应该使用system
的原因是,system
调用shell,这意味着你必须担心引用参数。如果你改用fork
和execvp
,你不必担心引用任何东西。fork
和wait
与线程混合相关的问题是真实的,但它们易于处理。如果您的操作系统有posix_spawn
,它将为您解决一些问题。我通常不建议使用posix_spawn
,因为使用它的代码通常比使用fork
的代码更难维护,但是对于这个应用程序它应该没问题。我无法在这个答案框中找到将fork
和wait
与线程混合的综合指南。gzip
压缩线程中等待zlib进程的数据。这避免了将fork
和wait
与线程混合的问题,但它为您的程序添加了一个库依赖,这可能不如依赖外部gzip
可执行文件那么方便。从另一个线程中的system
调用开始,只在需要时添加复杂性。
执行fork
/ exec
或使用zip
库的额外复杂性仅值得努力,如果system
由于某种原因不够(即你想将子进程的stdin
和stdout
重定向到你的父进程,或者你想要压缩内存中的文件,用于通过网络发送而无需编写新文件)。