使用busybox在execl中执行tar命令。错误:没有这样的文件或目录

时间:2017-08-26 10:07:33

标签: c++ fork tar busybox execl

我有一个基于linux的设备,它使用QT框架运行c ++代码。使用QProcess不是一种选择,因为我们没有编译QT来支持它。

我无法使用execl()创建tar.gz存档。

返回-1(失败),错误为"No such file or directory"

代码示例:

std::string applicationPathWithName = "/bin/busybox";
QString dataDirectory("/opt/appl/data/");
QString archiveName = QString("AswLogs.tar.gz");
char* applName;
applName = new char [applicationPathWithName.size() + 1];
strcpy(applName, applicationPathWithName.c_str());

itsFlmFileManagerPtr->writeInFile(eFlmFileTypes_LogFile, data); //This creates logs.txt successfully

pid_t pid = fork();

QString command = QString("tar -czvf %1%2 %3logs.txt").arg(dataDirectory).arg(archiveName).arg(dataDirectory);

if(0 == pid)
{
    INFO("Pid is 0");
    int execStatus = 0;
    execStatus = execl(applName, applName, command.toStdString().c_str(), (char*)NULL);
    INFO("Execl is done, execStatus= " << execStatus);
    std::string errorStr = strerror(errno);
    INFO("Error: " << errorStr);

    _exit(EXIT_FAILURE);
}
else if (pid < 0)
{
    INFO("Failed to fork");
}
else
{
    INFO("pid=" << pid);
    int status;
    if(wait(&status) == -1)
    {
        INFO("Wait child error");
    }
    INFO("Resume from fork");
}

输出:

PID = 877

Pid是0

执行完成,execStatus = -1

错误:没有这样的文件或目录

从fork恢复

权限:

logs.txt 666 | busybox 755

如何获取更多错误详情或此处有什么问题?

Edit: 所以,过了一段时间,我试着只做.tar档案,它起作用了。 然后我尝试了.gz压缩,它也有效。

解决方案: 所以,至少在我的情况下,解决方案是分两步完成tar.gz(需要两个过程):

execl("/bin/busybox", "/bin/busybox", "tar", "-cvf", "/opt/appl/data/logs.tar", "/opt/appl/data/logs.txt", (char*) NULL);

execl("/bin/busybox", "/bin/busybox", "gzip", "/opt/appl/data/logs.tar", (char*) NULL);

1 个答案:

答案 0 :(得分:0)

我不知道这是什么平台或编译器,但通常不可能将整个命令行传递给execl()。如果我理解正确,你运行的是这样的:

execl ("/bin/busybox", "/bin/busybox", "tar -czvf blah blah", null);

但一般来说你需要

execl ("/bin/busybox", "/bin/busybox", "tar", "-czvf", "blah", "blah", null);

也就是说,您需要将命令行解析为其各个参数。在你描述的情况下,这应该很容易,因为你已经知道了各个论点是什么。

我认为问题是/ bin / busybox启动了,但是当它试图解释&#34; tar -czvf blah blah&#34;作为要运行的applet的名称。

顺便说一句 - 也许并不相关 - busybox&#34; tar&#34;除非您在构建时启用了此功能,否则默认情况下不会在内部处理gzip压缩。