C - передача неизвестной команды в execvp () - PullRequest
0 голосов
/ 14 октября 2010

Я пишу фальшивую оболочку, где я создаю дочерний процесс и затем вызываю execvp (). В обычной оболочке при вводе неизвестной команды, такой как «привет», возвращается «привет: команда не найдена». Тем не менее, когда я передаю hello в execvp (), он не возвращает ошибку по умолчанию и просто продолжает работу остальной части моей программы, как будто ничего не произошло. Какой самый простой способ узнать, действительно ли ничего не было запущено? вот мой код:

if(fork() == 0)
{
     execvp(cmd, args);
}
else
{
     int status = 0;
     int corpse = wait(&status);
     printf(Child %d exited with a status of %d\n", corpse, status);
}

Я знаю, что если труп <0, то это неизвестная команда, но в моем коде нет других условий, которых я не хочу ждать (например, если & вводится в конце команды). Есть предложения? </p>

Ответы [ 2 ]

3 голосов
/ 14 октября 2010

Все методы exec могут возвращать -1, если произошла ошибка (errno установлен соответствующим образом).Вы не проверяете результат execvp, поэтому, если он потерпит неудачу, остальная часть вашей программы продолжит выполнение.Вы можете сделать что-то подобное, чтобы предотвратить выполнение остальной части вашей программы:

if (execvp(cmd, args) == -1)
    exit(EXIT_FAILURE);

Вы также хотите проверить результат fork() для <0. </p>

0 голосов
/ 14 октября 2010

У вас есть две независимые проблемы.

1) - возвращаемое значение execvp. Это не должно вернуться. Если это так, есть проблема. Вот что я получаю, исполняя плохую команду. Вы не хотите ждать, если execvp не удается. Всегда проверяйте возвращаемые значения.

int res = execvp(argv[1], argv);
printf ("res is %i %s\n", res, strerror(errno));
// => res is -1 No such file or directory

2) Другая проблема - это фоновые процессы и тому подобное. Это работа оболочки, и вам нужно выяснить, когда ваша программа должна ждать немедленно, а когда вы хотите сохранить pid из fork и ждать его позже.

...