2015-11-03 3 views
1

Я ищу способ определить, была ли функция execvp успешной или неудачной. Я знаю, что если он вернется, то он потерпел неудачу, но я ищу случай, когда команда, запущенная с execvp, потерпела неудачу. Например, в случае, когда «ls» пытается перечислить несуществующую папку. Из этого я планирую добавить поддержку для логических операторов (например, & &, ||). Благодарю.Определите, было ли execvp успешным или неудавшимся

else { 
    int status; 
    if (wait(&status) < 0) { 
     perror("wait failed"); 
     exit(0); 
    } 
    if (status == 0) { 
     success = true; 
    } 
    else { 
     success = false; 
    } 
} 

ответ

3

Вы должны сначала fork() новый процесс, то есть, что новый вызов процесс execvp. Затем родительский процесс должен вызвать wait(), что позволит ему получить статус выхода команды, которую вы выполнили (ls, в данном случае).

При проверке возвращаемого состояния, полученного от wait(), обязательно используйте WIFEXITED(), чтобы обеспечить нормальное выход ребенка и использовать WEXITSTATUS() для извлечения статуса выхода.

+0

Прямо сейчас у меня есть это, в конце моих проверок, чтобы убедиться, что вилка провалилась. Но я не думаю, что ищу нужную информацию из статуса. 'else if (c_pid> 0) { pid = waitpid (c_pid, & status, 0); if (pid == -1) {perror («wait failed»); \t выход (0); \t} if (status == 0) { \t success = true; \t} success = false; /* if ((pid = wait (& status)) <0) { perror ("wait ..."); выход (1); } */ } ' – xythyl

+0

@xythyl Обновите свой вопрос кодом. Это невозможно прочитать в комментарии. – dbush

+0

Спасибо! Кроме того, как мне правильно отправлять код здесь? По какой-то причине он не поддерживал форматирование. – xythyl

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