我使用以下代码段在广泛的测量软件中创建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;
我知道有几个库,例如
libarchive
,libtar
等,使用起来并不像触发系统命令那样懒惰,但是我想知道为什么这不适用于我的情况。此外,“我的忙碌”框中的
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/