从 C++ 程序创建 tar.gz-archive 不起作用

Creating tar.gz-archive from c++ program does not work

我使用以下代码片段在广泛的测量软件中创建 tar.gz-archive。在几个文件中收集了一些数据后,我想将它们存档并压缩以备后用。 当我从 shell 启动程序时一切正常,所有数据都已正确收集和存档。

但是,程序应该在嵌入式 Linux 系统启动后自动启动。当它通过 /etc/init.d 中的脚本启动时,没有数据文件 archived/compressed,即使我得到 return 值 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());

也许这会帮助其他用户解决同样的问题。