Команда tar в execl с использованием busybox. Ошибка: нет такого файла или каталога

У меня есть устройство на основе Linux, которое выполняет код C ++, используя каркас QT. Использование QProcess не вариант, так как у нас нет скомпилированного QT для его поддержки.

Я не могу создать tar.gz архивировать с помощью execl ().

Возвращает -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

Пид 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 blah blah» как имя запускаемого апплета.

Случайно — и, вероятно, не связанный — «tar» busybox не будет обрабатывать сжатие gzip внутри по умолчанию, если вы не включили эту функцию во время сборки.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector