2012-11-23 1 views
1

다음 코드가 있습니다.fork()에서 execvp의 에러를 얻는 방법?

내 질문은 status 변수에 코드

 int main() { 

      .... 

     if ((uproc.pid = fork()) == -1) { 
      return -1; 
     } 

     if (uproc.pid == 0) { 
      /* child */ 

      const char *argv[3]; 
      int i = 0; 
      argv[i++] = "/bin/sh"; 
      argv[i++] = "/my/script.sh"; 
      argv[i++] = NULL; 

      execvp(argv[0], (char **) argv); 
      exit(ESRCH); 

     } else if (uproc.pid < 0) 
      return -1; 

     /* parent */ 
     int status; 
     while (wait(&status) != uproc.pid) { 
      DD(DEBUG,"waiting for child to exit"); 
     } 

      // If /my/script.sh exit accidentally in some place with error. 
      // can I catch this error right here? 
      ...... 
    } 
+0

'wait' 함수를 사용하면'status' 변수에 들어갑니다. –

+0

내 질문에 대한 응답이 될 수 있습니다 – MOHAMED

+0

상태는 항상 0입니다. 오류가없는 경우 및 스크립트에 오류가있는 경우를 대비하여 – MOHAMED

답변

4

아이의 종료 상태가 wait 기능에 의해 제공됩니다입니다.

당신은 WEXITSTATUS 매크로를 사용하여 종료 상태를 얻을 수 있지만 경우에만 프로그램이 정상적으로 종료 (즉 exit 전화 또는 main 함수에서 반환) :

if (WIFEXITED(status)) 
    printf("Child exit status: %d\n", WEXITSTATUS(status)); 
else 
    printf("Child exited abnormally\n"); 

자세한 내용은 manual page for wait을 읽어보십시오.

+0

OP에서 그것은 분명하지 않습니다. cmd를 실행 ... * ") 정말 원하는 경우 종료 코드입니다. 어쨌든 1+, 그게 모두가 얻을 수있는. – alk

+0

중간에 오류가 있기 때문에 메시지 오류가있는 중간에 내 스크립트가 종료됩니다. 상태는 항상 0을 리턴합니다. (스크립트에서 에러가 있고 cas에 에러가 있습니다.) – MOHAMED

+0

그래서 이것을 바꾸지 말고 스크립트가 성공할 경우에만 'exit 0'을 사용하고 어떤 에러라도 'exit'로 호출하게하십시오. '0'과 다른 인수. @MohamedKALLEL – alk

관련 문제