fork — c ++ unzip возвращает не может создать каталог извлечения

Я написал простой кусок кода для распаковки zip-файлов с помощью unzip. Работает нормально, если выходной каталог не установлен, но возвращает ошибку, если каталог установлен

«Архив: /home/vishvesh.kumar/tempFolder/test.zip checkdir: невозможно
создать каталог для извлечения: /home/vishvesh.kumar/tempFolder
Данный файл или каталог отсутствует»

Код:

int main(int argc, char *argv1[])
{
std::cout << "Creating child process...";
std::vector<std::string> arguements;

char* argv[4] = {0};
argv [0] = "/usr/bin/unzip";
argv [2] = "/home/vishvesh.kumar/tempFolder/test.zip";
argv [1] = "-d /home/vishvesh.kumar/tempFolder/";
argv [3] = NULL;
createChildProcess(argv);

}void createChildProcess(char* argv[])
{
pid_t pid = fork();
if (pid == -1)
{
std::cout << "error creating child process, exiting...";
exit(1);
}
else if (pid == 0)
{ // This is the child process
std::cout << "This is the child process. About to sleep\n";
std::cout << "Woke up\n";
if (execvp(argv[0], argv))
{ // execvp failed
std::cout << "fatal - execvp failed!";
exit(1);
}

}
else
{ // This is the parent process.
std::cout << "This is the parent process\n";
int status;
std::cout << " done. PID: " << pid << ".\n";

double start = 0;
waitpid(pid, &status, 0); // Wait for program to finish executing.
double dur = (clock() - start) / CLOCKS_PER_SEC; // Get execution time
std::cout << "Sad my son died\n";
std::cout << "Program returned " << WEXITSTATUS(status);
std::cout << " and lasted " << dur << " seconds.\nPress enter.\n";
std::cin.get();
}
}

0

Решение

char* argv[4] = {0};
argv [0] = "/usr/bin/unzip";
argv [2] = "/home/vishvesh.kumar/tempFolder/test.zip";
argv [1] = "-d /home/vishvesh.kumar/tempFolder/";
argv [3] = NULL;

Должно быть:

char* argv[5];
argv [0] = "/usr/bin/unzip";
argv [1] = "-d";
argv [2] = "/home/vishvesh.kumar/tempFolder/";
argv [3] = "/home/vishvesh.kumar/tempFolder/test.zip";
argv [4] = NULL;

Как у вас есть, параметр для -d это почтовый файл, так как это параметр после -d, Поэтому он пытается создать этот каталог и не может, потому что это файл.

2

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

argv [1] = "-d /home/vishvesh.kumar/tempFolder/";

должно быть

argv [1] = "-d";
argv [2] = "/home/vishvesh.kumar/tempFolder/";

Это два отдельных параметра, передаваемых новому процессу через execvp(),

2

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