2016-11-02 11 views
1

저는 bash 쉘에서 ||, &&; 연산자를 구현하려고합니다. 내가 뭘 하려는지, int 플래그가 성공한 경우 1로, 그렇지 않은 경우 0으로 설정됩니다. 내 문제는 내가 1로 플래그를 설정하는 등 ls -apples으로 잘못된 동작을 입력 할 경우에도 나는 또한 오류 메시지가 있다는 것입니다C++에서 쉘용 bash 연산자 구현

LS : 잘못된 옵션 - 'E' '에게 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

내가 한 것은'waitpid'의'status' 값을 보았습니다. 나는 0이 아닌 어떤 값도 유효하지 않음을 발견했다. 이것을 처리하기 위해 부울 플래그를 만들었습니다. 이게 유효합니까? – ecain

답변

0

이 솔루션은 수 그 status 돌아보고했다 : 다음은 내 코드입니다. 서명은 성공했는지 여부를 알려줍니다.