我有一個使用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);
你理解正確。我試過你的版本分離的參數,但仍然,我得到了「沒有這樣的文件或目錄」錯誤。另外,我用「-cvf」替換了「-czvf」,分別用「AswLogs.tar」替換了「AswLogs.tar.gz」,但沒有成功。你有什麼其他的建議? – ionutCb
是否檢查從命令提示符下調用當你的Busybox的tar命令可以正常工作?在execl()調用之後,errno的值是多少? –
是的,我檢查。從終端調用罰款。 errorStr的值是「沒有這樣的文件或目錄」 – ionutCb