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);
正しく理解しました。私は引数を区切ってあなたのバージョンを試してみましたが、私は同じ "No such file or directory"エラーを持っています。また、 "-czvf"を "-cvf"、 "AswLogs.tar.gz"を "AswLogs.tar"に置き換えましたが、成功しませんでした。他に提案はありますか? – ionutCb
Busybox tarコマンドがコマンドプロンプトから呼び出されたときに正しく動作することを確認しましたか? execl()呼び出しの後にerrnoの値は何ですか? –
はい、チェックしました。ターミナルから呼び出しても問題ありません。 errorStrの値は "No such file or directory"です。 – ionutCb