我使用以下代码段在广泛的测量软件中创建tar.gz
- 存档。收集几个文件中的一些数据后,我想将其存档并压缩以供以后使用。
当我从shell启动程序时,一切正常,所有数据都被正确收集和存档。
但是,程序应该在嵌入式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;
我知道有几个librariers,比如libarchive
,libtar
等,使用它们并不像启动系统命令那样懒,但我想知道为什么这不起作用对于我的情况。
此外,我忙的框中的tar
版本不支持选项z
。
答案 0 :(得分:-1)
我终于为我的问题找到了解决方案,也许是在守护程序调用系统命令的所有情况下:
诀窍是通过命令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());
也许这会帮助其他用户解决同样的问题。