使用系统调用与基于库的方法压缩目录的优缺点

时间:2019-01-11 15:01:34

标签: c++ system-calls tar

场景:
我在运行有C ++应用程序的嵌入式linux 发行版上运行。我只需要压缩目录并将压缩后的输出放置在某个位置即可。而已。

我知道我们可以在命令行界面上使用以下命令tar压缩目录。

tar cvzf directory.tar.gz /path/to/directory

我看到我可以选择在C ++中运行系统命令。以下是一个示例。

void CompressDirectory() {
    std::system("tar cvzf directory.tar.gz /path/to/directory");
}

环境:
嵌入式Linux

问题:
我想知道进行系统调用以对目录进行tar与使用zlibzipios等库之类的利弊。

2 个答案:

答案 0 :(得分:1)

system()通常不被接受,因为与之相关的潜在安全风险。在您明确说明所有内容的特定情况下,您会没事的。

您可以在程序中对其进行编码,以便以编程方式进行处理和处理,而不必将其脱壳,这是正确的方法。

只要您的tarball名称和目录都经过硬编码,我就不会想到任何安全问题,但是我要小心,以确保您不会覆盖任何东西或类似内容。

如果您自己以外的其他人甚至都可以触摸服务器,请不要使用system()

答案 1 :(得分:1)

  1. 至少您不检查当前代码中的结果。你不知道压缩是否失败。
    您必须至少检查exit code
  2. 通常情况下,#standardSQL WITH q1 AS ( SELECT STRUCT([1, 2], [3, 4], [5, 6]) AS line ) SELECT ARRAY(SELECT CAST(item AS INT64) FROM UNNEST(new_line) item) AS count_to_six FROM ( SELECT (SELECT ARRAY_CONCAT_AGG(SPLIT(arr)) FROM UNNEST(REGEXP_EXTRACT_ALL(TO_JSON_STRING(q1), r'\[(.+?)]')) arr ) new_line FROM q1 ) 在命令行中不可用(例如,在Windows上)。
    这不是您的情况,所以您可以忽略这一点。
  3. 自定义库应提供更灵活的压缩方式。像暂停,选择文件,无限数量的文件等等。