Как использовать Exec () для запуска программы AC из другой программы C - PullRequest
0 голосов
/ 13 сентября 2018

Я пытался использовать execvp для запуска программы ac, но она всегда кажется неудачной.

из main.c

int main() {
char* args[] = {"2", "1"};
    if(execvp("trial.c", args) == -1) {
        printf("\nfailed connection\n");
    }

из trial.c

int main(int argc, char** argv){
printf("working");
return 1;
}

Я думаю, что я пытался всеми возможными способами представить это расположение файла в exec (), и это всегда приводит к "сбой соединения".

Ответы [ 4 ]

0 голосов
/ 13 сентября 2018

Первый аргумент для execvp - путь к исполняемому файлу. Вам необходимо собрать исполняемый файл для trial.c и передать путь к исполняемому файлу execvp.

if(execvp("---path to executable---/ExecTrial", args) == -1) {
    printf("\nfailed connection\n");
}

Если вы не передадите путь к исполняемому файлу, execvp будет искать исполняемый файл в списке разделенных двоеточиями имен каталогов, указанных в PATH переменная окружения.

0 голосов
/ 13 сентября 2018

trial.c не является допустимым исполняемым файлом. C не является скриптовым или интерпретируемым языком; Вы не можете запускать исходные файлы на C напрямую. Программа на C должна быть скомпилирована и связана с исполняемым файлом.

0 голосов
/ 13 сентября 2018

Первый параметр execvp ожидает имя исполняемого файла. То, что вы передали, это имя исходного файла. Вам необходимо сначала скомпилировать trial.c, а затем передать имя скомпилированного исполняемого файла в execvp.

Что касается второго параметра execvp, последний элемент в массиве должен быть NULL. Вот как он узнал, что достиг конца списка. Кроме того, условно, что первым параметром программы является имя самой программы.

Итак, сначала скомпилируйте trial.c:

gcc -g -Wall -Wextra -o trial trial.c

Затем измените способ его вызова в main.c:

int main() {
    char* args[] = { "trial", "2", "1", NULL };
    if(execvp("trial", args) == -1) {
        printf("\nfailed connection\n");
    return 1;
}
0 голосов
/ 13 сентября 2018

Если вы пытаетесь вызвать execvp() в исходном файле, то это не то, что делает эта функция.Предполагается, что первым аргументом будет путь к исполняемому файлу.Если вы хотите запустить программу, источником которой является trial.c , вы должны сначала собрать (скомпилировать и все такое).Например, вот так:

$ gcc -o trial trial.c 

Затем вызовите execvp() для вновь созданного исполняемого файла вместо исходного файла:

if(execvp("trial", args) == -1) { //...
...