2016-11-02 8 views
1

Я пытаюсь реализовать операторы ||, && и ; в оболочке bash, которую я создаю. То, что я пытаюсь сделать, использует int как флаг, который будет установлен в 1, если он был успешным, или 0, если это не так. Моя проблема заключается в том, что даже если я вхожу недопустимую операцию, например, как ls -apples она устанавливает флаг 1. Я также получаю сообщение об ошибкеРеализация баш-операторов для оболочки в C++

лс неверный вариант - «е» Попробуйте «Ls --help» для получения дополнительной информации

поэтому, я думаю, это означает, что это технически выполняется? Как мне отслеживать, не выполнила ли execvp операцию? Вот мой код:

pid_t pid; 
    pid_t waitId; 
    int status; 
    //forks into two processes 
    pid = fork(); 
    //There was an error during fork 
    if (pid < 0) 
    { 
     successFlag = 0; 
     perror("There was an error"); 
    } 
    else if (pid == 0) 
    { 
     //must be cast because our function expects a char *const argv[] 
     if (execvp(command[0], (char**)command) < 0) 
     { 
      //error at execvp 
      successFlag = 0; 
      perror("There was an error executing the process"); 
     } 
      exit(EXIT_FAILURE); 
    } 

    else 
    { 
     do 
     { 
      waitId = waitpid(pid, &status, WUNTRACED | WCONTINUED); 
      if(waitId == -1){ 
       successFlag = 0; 
       perror("Error in parent process"); 
       exit(EXIT_FAILURE); 
      } 

     } 

     while (!WIFEXITED(status) && !WIFSIGNALED(status)); 
    } 
    //use this flag to determine whether the process was a success 
    successFlag = 1; 
+0

Вы правы, команда ls бежала. Если я правильно понимаю вашу проблему, вы хотите определить, отправила ли команда сбой. В этом случае вам понадобится «код ошибки» (код выхода), возвращаемый командой. –

+0

То, что я сделал, смотрел на значение 'status'' waitpid'. Я обнаружил, что любое значение, которое не было 0, было недействительным. Для этого я создал логический флаг. Действительно ли это? – ecain

ответ

0

Решение было смотреть на номер, который status возвращается. Знак подскажет, успешно ли это или нет.