Как мне запустить исполняемый файл в другом каталоге на C?

#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");
  

он не находит его.

Вы можете решить эту проблему, используя любой из следующих методов:

  1. Измените команду, заданную на system :

     system("../folder1/folder2/executable_name");
      
  2. Измените команду, заданную на system :

    Это будет работать, если ваша оболочка по умолчанию bash и многие оболочки UNIX.

     system("cd ../folder1/folder2; ./executable_name");
      
  3. Создайте сценарий оболочки, который имеет:

     #/bin/bash
    cd  ../folder1/folder2
    ./executable_name
      

    а затем запустите сценарий оболочки из C, используя system

     system("myscript.sh");
      
  4. Добавьте строку 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 для изменения каталога текущей исполняемой программы.