我使用以下代码段在广泛的测量软件中创建tar.gz归档。在几个文件中收集了一些数据后,我想将其存档并压缩以供以后使用。
当我从外壳启动程序时,一切工作正常,所有数据均已正确收集和存档。

但是,该程序应在嵌入式Linux系统的系统启动后自动启动。通过/etc/init.d中的脚本启动它时,即使我得到了返回值0,也不会存档/压缩任何数据文件。此外,创建了tar.gz文件,但它为空。
其他一切工作正常。

任何人都可以解释一下,在这种自动启动的特殊情况下我该怎么办?

int returnValue = -1;
std::string jobString = RESULT_PATH;
jobString += "/";
jobString += lastJobString;
std::string jobFiles = lastJobString + "*.*";

std::string cmd = "tar cvf - ";
cmd += jobFiles;
cmd += " | gzip > ";
cmd += jobString;
cmd += ".tar.gz";

std::cout << "archiving and compressing " << jobFiles << ": " << cmd << std::flush << std::endl;

returnValue = system(cmd.c_str());

std::cout << "archiving and compressing finished. Code: " << returnValue << std::flush << std::endl;


我知道有几个库,例如libarchivelibtar等,使用起来并不像触发系统命令那样懒惰,但是我想知道为什么这不适用于我的情况。

此外,“我的忙碌”框中的tar版本不支持选项z

最佳答案

我终于找到了针对我的问题的解决方案,可能是针对守护程序调用系统命令的所有情况的解决方案:

技巧是通过命令sh创建一个新的shell,并在调用tar函数之前更改当前目录:

std::string cmd = "sh -c \" cd ";
cmd += SOURCE_DIR;
cmd+= " && tar cvf - ";
cmd += jobFiles;
cmd += " | gzip > ";
cmd += jobString;
cmd += ".tar.gz";

returnValue = system(cmd.c_str());


也许这将有助于其他用户解决相同的问题。

关于c++ - 从C++程序创建tar.gz存档不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39504179/

10-11 22:49
查看更多