#c #executable
#c #исполняемый файл
Вопрос:
Я хочу запустить исполняемый файл, найденный в ../folder1 / folder2, находясь внутри скрипта C. Прямо сейчас я пытаюсь сделать:
char command[50];
strcpy(command, "cd ../folder1/folder2");
system(command);
memset(command,0,sizeof(command));
strcpy(command, "./executable_name");
system(command);
но это не работает. Должен ли я использовать chdir() или есть другой способ сделать это? Возможно ли это вообще?
Комментарии:
1. Не работает?
strcpy(command, "../folder1/folder2/executable_name"); system(command);
2. Возможно, у вас нет доступа к определенным папкам
3. C не является скриптовым языком; звучит очень странно говорить «внутри скрипта C».
4. Кроме того,
system()
создает подоболочку для выполнения ваших команд, поэтому вашаcd
будет применяться только в пределах этой подоболочки, которая завершается до создания новой для вашей второй команды.
Ответ №1:
Это не работает, потому что при выполнении:
system("cd ../folder1/folder2");
это не влияет на текущий каталог исполняемого файла. Следовательно, когда вы выполняете:
system("./executable_name");
он не находит его.
Вы можете решить эту проблему, используя любой из следующих методов:
-
Измените команду, заданную на
system
:system("../folder1/folder2/executable_name");
-
Измените команду, заданную на
system
:Это будет работать, если ваша оболочка по умолчанию
bash
и многие оболочки UNIX.system("cd ../folder1/folder2; ./executable_name");
-
Создайте сценарий оболочки, который имеет:
#/bin/bash cd ../folder1/folder2 ./executable_name
а затем запустите сценарий оболочки из C, используя
system
system("myscript.sh");
-
Добавьте строку
chdir
в C перед вызовомsystem
:chdir("../folder1/folder2"); system("./executable_name");
Обновление, спасибо @Jongware
Все вышесказанное предполагает, что ваша программа выполняется в каталоге, из которого ../folder1/folder2
указан допустимый путь. Если ваша программа выполняется из другого каталога, и вы хотите учесть этот сценарий, вам необходимо проанализировать argv[0]
и настроить способ обработки вызовов для выполнения executable_name
.
Комментарии:
1. Я заставил его работать с chdir. Спасибо за объяснение того, как на самом деле работает system.
2. .. но обратите внимание, что это все еще зависит от того, запускается ли ваш исполняемый файл в его собственной папке . Можно запустить исполняемый файл в другой папке, и тогда ваш (относительный!) Путь не будет найден.
3. @Jongware, хорошая мысль. Вы не возражаете, если я добавлю это к ответу?
4. Конечно, продолжайте. (Является ли синтаксический
argv[0]
анализ надежным решением? Возможно, это обсуждалось на SO раньше.)
Ответ №2:
Самый простой способ обычно:
system("../folder1/folder2/executable_name");
В противном случае вам нужно либо выполнить cd
via chdir()
в вашей программе, либо организовать выполнение cd
и выполнение команды в одной оболочке (один вызов system()
), как в:
system("cd ../folder1/folder2; ./executable_name");
Ответ №3:
Проблема в том, что система выполняет форк, выполняет cd в подпроцессе, который завершается и не влияет на рабочий каталог программного процесса. Оболочки, необходимо создать встроенные cd и dirs, чтобы они имели эффект.
Вместо того, чтобы использовать команду оболочки, вы можете использовать getwd
and chdir
для изменения каталога, а затем system с "."
помощью, как вы пытались, добавьте "cd ../folder1/folder2; ./executable_name"
, используйте fork
и измените каталог и запустите команду в дочернем exec
файле самостоятельно, или, в качестве альтернативы, просто запустите программу, используя относительный путь «../folder1 / folder2/executable_name».
#include <unistd.h>
int chdir(const char *path);
char *getcwd(char *buf, size_t size);
Ответ №4:
Вам нужно выполнить скрипт, который изменяет каталог, а затем запускает приложение.
Ответ №5:
Вы можете просто выполнить программу, используя относительный или абсолютный путь. Если вы действительно хотите выполнить его в другом рабочем каталоге, читайте дальше.
В настоящее время ваша программа не изменяет свой рабочий каталог перед выполнением дочерней программы.
Просто объясняется, system
запускает новую программу, которая изменяет свой рабочий каталог, а затем завершает работу, поэтому ваша программа не затрагивается.
То, что вы пробовали, работает в реальных сценариях, потому что интерпретатор не создает новую оболочку для каждой команды, которую вы ему даете, а выполняет их сам.
Используйте chdir()
или какой-либо другой API для изменения каталога текущей исполняемой программы.