Попытка вызвать execvp для запуска имени программы, предоставленного через stdin, но каждый раз вызывать ошибку

Добрый вечер

Я нашел несколько подобных вопросов, но ничего, что не достаточно на основе этого конкретного вопроса.

Я разветвляю дочерний процесс и пытаюсь вызвать execvp для запуска простой программы, которая выводит 3 символа в стандартный вывод. Имя программы для запуска происходит от ввода пользователя.

По какой-то причине каждый вызов execvp не выполняется для simpleO:

Я компилирую файл simpleO.c в simpleO, а затем компилирую и запускаю fork.c. Я набираю simpleO в командной строке при запросе на попытку запуска, но каждый раз получаю сообщение об ошибке. Вот код

Сообщение об ошибке, напечатанное perror: "Нет такого файла или каталога"

-

fork.c

#include <stdio.h>
#include <unistd.h>/*fork, exec*/
#include <errno.h>/*errno*/
#include <string.h> /*strerror*/
#include <stdlib.h>/*EXIT_FAILURE*/

#define BUFFERSIZE 100

int main(int argc, char *argv[]){
int i = 0;
pid_t pid;
int status;
char buffer[BUFFERSIZE];

fgets(buffer, BUFFERSIZE, stdin);

argv[0] = strtok(buffer, " ");
while (buffer[i] != '\0') {/*analyze each char*/
    if (buffer[i] == ' ')/*based on how many spaces there are*/
        argv[i] = strtok(NULL, " ");/*tokenize, populate argv*/
    i++;
}  

if((pid = fork()) == -1){
    fprintf(stderr, "fork error: %s\n", strerror(errno));
    return EXIT_FAILURE;}
else if (pid==0) {
    int e = execvp(argv[0],argv);
    if (e==-1) {
        perror("Exec failed");
        printf("Process %s\n",argv[0]);
        perror("Process did not run");
        exit(1);
    }
}
else{
    wait(&status);}
return 0;
}

-

simpleO.c

#include <stdio.h>
int main(int argc, char **argv){
    printf("%c",'c');
    printf("%c",'2');
    printf("%c",'1');
return 0;
}

Addl ref: perror печатает "Нет такого файла или каталога"

1 ответ

Решение

Хорошо, смотрите: ключевой урок в программировании заключается в том, что когда сообщение об ошибке говорит вам что-то, вы должны верить этому. Итак, ваша программа говорит "нет такого файла или каталога", и это означает, что файл, который вы пытаетесь запустить, не существует по какому-либо пути, который вы пытаетесь использовать.

Теперь вы знаете, что это не путь по умолчанию, поэтому следующая вещь, которую нужно попробовать, - это использовать абсолютный путь к исполняемому файлу. Теперь, учитывая все остальное, я бы предложил вам написать очень простую программу на C, которая ничего не делает, кроме попыток форка / исполнения вашей дочерней программы. нет argv вектор или что-нибудь, просто fork а потом execvp у ребенка с исполняемым путем абсолютная часть.

Другие вопросы по тегам