자식 프로세스를 종료하고 execvp ()에서 상태를 반환하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/903864

  •  05-09-2019
  •  | 
  •  

문제

간단한 사용자 정의 쉘에서 표준 입력에서 명령을 읽고 execvp ()로 실행합니다. 그 전에는 현재 프로세스의 포크를 만들고 그 자녀 프로세스에서 execvp ()를 호출합니다. 그 직후에 Exit (0)을 호출합니다.

이 같은:

pid = fork();

if(pid == -1) {
    perror("fork");
    exit(1);
}

if(pid == 0) {
    // CHILD PROCESS CODE GOES HERE...
    execvp(pArgs[0], pArgs);
    exit(0);
} else {
    // PARENT PROCESS CODE GOES HERE...
}

이제 execvp ()로 실행되는 명령은 오류를 올바르게 반환 할 수 있습니까? 나는 그것을 올바르게 처리하고 싶고 지금은 항상 Exit (0)이라고 부릅니다. 이는 아동 프로세스가 항상 "OK"상태를 가질 것임을 의미합니다.

execvp () 호출에서 올바른 상태를 반환하고 exit () 호출에 넣을 수있는 방법은 무엇입니까? execvp ()가 반환하는 int 값을 가져 와서 0 대신 exit () 인수로 전달해야합니까?

도움이 되었습니까?

해결책

사용해야합니다 waitpid(3) 또는 wait(1) 부모 코드에서 자녀가 종료하고 오류 메시지를받을 때까지 기다릴 때까지.

구문은 다음과 같습니다.

pid_t waitpid(pid_t pid, int *status, int options);

또는

pid_t wait(int *status);

status 출구 상태를 포함합니다. 를보세요 남자 페이지 구문 분석 방법을 보려면.


아동 과정에서는 이것을 할 수 없습니다. 일단 전화하면 execvp 아동 과정 죽습니다 (모든 실제 목적을 위해) 그리고 IS 교체 에 의해 exec'D 프로세스. 도달 할 수있는 유일한 방법 exit(0) if가 있습니다 execvp 그 자체가 실패하지만 실패는 새로운 프로그램이 끝나기 때문이 아닙니다. 그것은 결코 시작하지 않았기 때문입니다.

편집하다: 아동 과정은 그렇지 않습니다 진짜 주사위. PID 및 환경은 변경되지 않지만 전체 코드와 데이터는 exec'D 프로세스. 당신은 믿을 수 있습니다 ~ 아니다 그렇지 않으면 원래 아동 과정으로 돌아갑니다 exec 실패합니다.

다른 팁

당신의 질문에서 당신이 요구하는 것을 알아 내기가 조금 어렵습니다. 그래서 나는 몇 가지 관련 문제를 다루려고 노력할 것입니다.

  • execvp() 반환하지 않거나 (성공시) 오류를 반환합니다. 자녀 코드는 핸들 오류 조건 만 필요하다는 의미입니다. 자녀 코드는 결과를 캡처해야합니다 execvp() 그리고 그 값을 사용하십시오 exit() 당신이 제안한대로. 유일한 성공은 execvp 일했고 저것 프로세스는 0 (또는 그렇지 않음)을 반환합니다.
  • 부모는 자녀 정보를 얻을 수 있습니다 waitpid() 종료 상태에 대해. 반환 된 정보에서 정보를 가져 오도록 정의 된 몇 가지 매크로가 있습니다. status 매개 변수. 당신의 목적에 주목할 만하다 WIFEXITED 아이가 "정상적으로"종료했는지 알려주고 WEXITSTATUS 자녀의 지위를 통과 한대로 얻습니다 exit(). 참조 waitpid 다른 매크로의 사람 페이지.

사용 wait() 또는 waitpid() 부모 과정에서. 여기에 예 : OS가 프로세스를 죽일 때 코드를 반환합니다.

또한 아이가 죽을 때 SIGCHLD 신호는 상위 프로세스로 전송됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top