在Redhat上从c++解压文件:system()的替代方案

Unzipping a file from C++ on Redhat: alternatives to system()

本文关键字:方案 system 上从 Redhat c++ 文件      更新时间:2023-10-16

我需要在运行c++程序时解压缩文件(在RedHat机器上运行c++代码之前等待解压缩完成)

要做到这一点,我现在这样做:

system("unzip /usr/bin/File/ZippedFile.gz -d /usr/bin/File/)

将"/usr/bin/File/ZippedFile.gz"解压缩到"/usr/bin/File/ZippedFile"没有问题。

这很好。然而,我注意到许多人似乎认为使用

system()

是禁忌。

人们似乎不喜欢它,因为安全性和系统资源(这里讨论:http://www.cplusplus.com/forum/articles/11153/)。

但是我想让程序等到解压缩完成,有没有可行的替代方案?

您可以使用普通的zlib,或者boost::iostream gzip工具。

系统本身不是错误的,但是您也可以为它编写一个不使用fork, exec, waitmkstemp外壳的替换。不过这很麻烦。如果你解压缩单个文件,使用boost::gzip_decompressor对我来说是最好的c++选项。如果您需要解压缩一个目录,那么使用fork和friends可能会更好。请务必阅读mkstemp

关于fork和exec家族的速成课程:http://www.yolinux.com/TUTORIALS/ForkExecProcesses.html

为您的孩子使用wait终止的示例:http://support.sas.com/documentation/onlinedoc/sasc/doc/lr2/wait.htm

关于创建临时目录的参考:http://www.gnu.org/s/hello/manual/libc/Temporary-Files.html

是的,出于各种原因(安全性、可移植性等),这是一种糟糕的做法。你需要得到一个压缩库(谷歌搜索给我一个类似http://www.firstobject.com/easy-zlib-c++-xml-compression.htm的东西,甚至是用来构建"解压缩"的库,如果它是免费的,但必须有加载),然后使用它,如果你需要并行地做这两个,然后引入线程。我同意有一点工作,但在实践中这比使用system()调用要好。