2017-08-26 46 views
0

我有一个使用QT框架运行C++代码的基于Linux的设备。使用QProcess不是一种选择,因为我们没有编译QT来支持它。使用busybox的execl中的tar命令。错误:没有这样的文件或目录

我无法使用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

Execl的已完成,execStatus = -1

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

恢复从叉

权限:

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);

回答

0

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

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

但一般而言,您需要

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

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

我认为问题在于/ bin/busybox启动,但当它尝试将“tar -czvf等等等等”解释为要运行的小程序的名称时出现窒息。

顺便说一句 - 可能不相关 - busybox“tar”默认不会在内部处理gzip压缩,除非您在构建时启用了此功能。

+0

你理解正确。我试过你的版本分离的参数,但仍然,我得到了“没有这样的文件或目录”错误。另外,我用“-cvf”替换了“-czvf”,分别用“AswLogs.tar”替换了“AswLogs.tar.gz”,但没有成功。你有什么其他的建议? – ionutCb

+0

是否检查从命令提示符下调用当你的Busybox的tar命令可以正常工作?在execl()调用之后,errno的值是多少? –

+0

是的,我检查。从终端调用罚款。 errorStr的值是“没有这样的文件或目录” – ionutCb

相关问题