Попытка вызвать 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
у ребенка с исполняемым путем абсолютная часть.