2014-10-31 3 views
1

에서 상태를 확인 :백그라운드 프로세스를 실행하고 나는 현재에 노력하고있어 부모

  1. 아이들 안에 포크() 호출 및 execvp는()와 백그라운드 프로세스를 실행합니다.
  2. execvp() 호출이 성공한 경우 자식 프로세스의 PID를 목록에 추가하십시오.
  3. execvp() 호출이 -1 (오류)을 반환하면 PID를 목록에 추가하지 마십시오.

내 문제는 : execvp()가 -1을 반환하면 (예를 들어, 실행 파일을 찾을 수없는 경우) 하위 프로세스 안에 있기 때문에 상위 프로세스와 "통신"할 수 없습니다. 포크(). 그리고 자식을 기다리기 위해 waitpid()를 사용하면 백그라운드 프로세스가 실행되지 않습니다. (동시성이 없어짐).

WNOHANG을 사용하고 상태를 (WEXITSTATUS (상태) == 1) 확인했지만 작동하지 않습니다 (부모 프로세스가 "즉시 실행"하고 자식이 아직 종료되었는지 알 수 없기 때문에 또는 그는) 내 생각은 무엇

내 현재 코드 :

void background(char *vector[]) { 
pid_t childp; 
int status; 
childp=fork(); 
    if (childp==-1){ 
     perror("Error using fork \n"); 
     return; 
    } 
    if (childp==0) { //Child process 
     if (execvp(vector[0],vector)==-1) { 
      perror("exec"); 
      exit(1); 
     } 
    } 
waitpid(-1, &status, WNOHANG); 
if(WIFEXITED(status)) { 
    //Child exited 
    if (WEXITSTATUS(status) == 1) { 
     //Child exited with error 
     return; 
    } 
} 
if (insertProcess(childp,vector)==-1) 
    perror("Full list"); 
else 
    updateList(); 
} 

나는 순간에 발견 한 유일한 해결책은 waitpid를 전 (1) 호 (출처 잠을 삽입한다 : https://stackoverflow.com/a/26617152/1339354), 그러나 이것은 더 본다 잘 된 것보다 해킹처럼. 다른 아이디어?

+1

파일, 파이프 또는 소켓과 같은 다른 방법으로 부모에게'exec()'의 성공 또는 실패를보고하지 않는 이유는 무엇입니까? –

+0

링크 된 질문에서만 내 조언을 반복 할 수 있습니다. – user58697

답변

0

WNOHANG에서 waitpid()를 사용하는 경우 하위 프로세스를 명확하게 지정하십시오. 그렇지 않으면 waitpid()는 마지막으로 죽은 자식의 상태를 반환합니다.

성공한 모든 프로세스를 목록에 저장하려고하는지 확실하지 않습니다. 당신이 그것을 시도하는 경우, 그들이 항상 죽지 않을 때 프로세스를 지우고 지우지 않는 이유는 무엇입니까? 신호 SIGCHLD를 제어하십시오. 이 경우 waitpid를 사용하여 어떤 프로세스가 죽었는지 확인하고 목록에서 삭제하십시오. 프로세스를 생성 할 때 SIGCHLD 시그널을 비활성화하고, 프로세스를리스트에 삽입 한 다음 시그널을 다시 활성화하십시오.

관련 문제