2017-08-26 7 views
0

QTフレームワークを使用してC++コードを実行するLinuxベースのデバイスがあります。 QProcessの使用はオプションではありません.QTをサポートするためにQTがコンパイルされていないからです。busyboxを使用するexeclのtarコマンド。エラー:そのようなファイルやディレクトリはありません

execl()を使用してtar.gzアーカイブを作成できません。

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

それは-1(失敗)を返し、エラーが"No such file or directory"

コードサンプルでありますexecStatus = -1

エラー:そのようなファイルやディレクトリ

再開フォークから

権限:

logs.txt 666 | ビジーボックス755

ここでエラーの詳細を確認するにはどうすればよいですか?

Edit: しばらくすると、私は.tarアーカイブだけを実行しようとしました。 次に、.gz圧縮を実行しようとしましたが、それも機能しました。

ソリューション: だから、少なくとも私の場合には、解決策は、2つの段階(必要な2つのプロセス)で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 blah blah"を解釈しようとするとチョークすると思う。

ちなみに、おそらく関連しない - ビジョンボックス "tar"は、ビルド時にこの機能を有効にしていない限り、gzip圧縮をデフォルトで内部的に処理しません。

+0

正しく理解しました。私は引数を区切ってあなたのバージョンを試してみましたが、私は同じ "No such file or directory"エラーを持っています。また、 "-czvf"を "-cvf"、 "AswLogs.tar.gz"を "AswLogs.tar"に置き換えましたが、成功しませんでした。他に提案はありますか? – ionutCb

+0

Busybox tarコマンドがコマンドプロンプトから呼び出されたときに正しく動作することを確認しましたか? execl()呼び出しの後にerrnoの値は何ですか? –

+0

はい、チェックしました。ターミナルから呼び出しても問題ありません。 errorStrの値は "No such file or directory"です。 – ionutCb

関連する問題