에서 상태를 확인 :백그라운드 프로세스를 실행하고 나는 현재에 노력하고있어 부모
- 아이들 안에 포크() 호출 및 execvp는()와 백그라운드 프로세스를 실행합니다.
- execvp() 호출이 성공한 경우 자식 프로세스의 PID를 목록에 추가하십시오.
- 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), 그러나 이것은 더 본다 잘 된 것보다 해킹처럼. 다른 아이디어?
파일, 파이프 또는 소켓과 같은 다른 방법으로 부모에게'exec()'의 성공 또는 실패를보고하지 않는 이유는 무엇입니까? –
링크 된 질문에서만 내 조언을 반복 할 수 있습니다. – user58697