2010-10-13 2 views
0

Я пишу фальшивую оболочку, где создаю дочерний процесс, а затем вызываю execvp(). В нормальной оболочке, когда я вхожу в неизвестную команду, такую ​​как «hello», она возвращает «hello: Command not found». Однако, когда я передаю привет в execvp(), он по умолчанию не возвращает никаких ошибок и просто продолжает работу с остальной частью моей программы, как ничего не произошло. Какой самый простой способ узнать, что на самом деле ничего не было сделано? вот мой код:C - передача неизвестной команды в 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, то это неизвестная команда, но есть и другие условия в моем коде нет в списке, где я не хочу ждать (например, если & вводится в конце команды). Какие-либо предложения?

ответ

3

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

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

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

0

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

1) - это возвращаемое значение execvp. Он не должен возвращаться. Если это так, проблема. Вот что я получил execvp'ing плохой команды. Вы не хотите ждать, если 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 из вилки и подождать позже.

Смежные вопросы