2017-08-26 74 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

相關問題