2012-12-06 2 views
4

waitpid()의 결과를 확인하여 실행 실패 여부를 확인하려고합니다. 그러나, 내가 아는 명령을 실행하여 stderr에 이슈를 쓰더라도, 아래의 수표는 결코 등록되지 않습니다. 이 코드가 잘못되었을 수 있습니까?fork/exec/waitpid 문제

도움 주셔서 감사합니다.

pid_t pid; // the child process that the execution runs inside of. 
int ret;  // exit status of child process. 

child = fork(); 

if (pid == -1) 
{ 
    // issue with forking 
} 
else if (pid == 0) 
{ 
    execvp(thingToRun, ThingToRunArray); // thingToRun is the program name, ThingToRunArray is 
             // programName + input params to it + NULL. 

    exit(-1); 
} 
else // We're in the parent process. 
{ 
    if (waitpid(pid, &ret, 0) == -1) 
    { 
     // Log an error. 
    } 

    if (!WIFEXITED(ret)) // If there was an error with the child process. 
    { 

    } 
} 
+1

'WIFSIGNALED'는 'WIFSIGNALED'와 'WIFSTOPPED'를 구분하는 데 사용됩니다. 정상적인 상황에서, 'WIFEXITED'는 자식이 실패 할 때 true가됩니다 (0이 아닌 상태에서 빠져 나옵니다). WIFEXITED와 WEXITSTATUS를 모두 확인해야합니다. –

답변

4

waitpid는 -1을 돌려 에러가 waitpid 발생합니다. 즉, 잘못된 pid를 주거나 중단 된 경우 등입니다. 자식의 종료 상태가 실패하면 waitpid가 성공하고 (pid 반환) 자식의 상태를 반영하도록 ret을 설정합니다.

어린이의 상태를 확인하려면 WIFEXITED(ret)WEXITSTATUS(ret)을 사용하십시오. 예 :

if(waitpid(pid, &ret, 0) == -1) { 
    perror("waitpid"); 
} else if(WIFEXITED(ret) && WEXITSTATUS(ret) != 0) { 
    ; /* The child failed! */ 
} 
+0

응답 해 주셔서 감사합니다. 처음에는 실제로 실패한 실행을 포착했습니다. 그러나 이제는 모든 실행을 실패로 간주하는 것으로 보입니다 ... 내가 하위 프로세스 실패의 이유가 무엇인지 정확하게 신경 쓰지 않으면 처음 업데이트 된 첫 번째 게시물의 코드가 모두 필요합니까? –

+0

와우 어떻게 든 나는 게시 한 코드 스 니펫을 놓쳤다. –

+0

귀하의 솔루션은 완벽하게 작동합니다. –