하위 프로세스가 자살하고 좀비가 됨

하위 프로세스가 자살하고 좀비가 됨

라즈베리파이에서 GPIO를 잠시 켜야해서 서브프로세스를 생성하고 GPIO를 잠시 켰다가 끄는 함수를 만들었습니다. 문제는 자식 프로세스가 스스로 죽도록 하려고 하면 좀비처럼 남아 있다는 것입니다. 이 함수는 여러 번 실행되기 때문에 이 상태로 계속 있을 수는 없습니다. 누구든지 해결책이 있습니까? 감사해요

void my_function(GPIOClass* gpio,useconds_t time) { pid_t pid=fork(); if(pid==0) { signal(SIGALRM,killchild) gpio->setval_gpio("1"); usleep(time*1000); gpio->setval_gpio("0"); alarm(3); while(1); } }

답변1

상위 프로세스에서 하위 프로세스를 가져와야 합니다. 바라보다 wait(2). 현재 일어나고 있는 것으로 보이는 것은 하위 프로세스 코드를 실행하는 경우만 처리하고 상위 프로세스의 결과는 무시한다는 것입니다. 따라서 상위 프로세스는 하위 프로세스가 종료된 후 정리 작업을 수행하지 않아 PID 누출이 발생합니다.

가장 간단한 해결책은 조건 else에 다음을 추가하는 것입니다.if

else if (pid > 0) {
    int status;
    waitpid(pid, &status, 0);
}

편집하다: 위의 조건은 하위 프로세스가 완료될 때까지 상위 프로세스를 차단합니다. 하위 프로세스가 종료되면 SIGCHLD신호는 상위 프로세스로 전송되며 기본적으로 무시됩니다. 그러나 POSIX.1-2001에 따르면 신호 처리기를 명시적으로 로 설정하면 SIGCHLD시스템 SIG_IGN은 자동으로 하위 프로세스를 정리하지만 상위 프로세스는 하위 프로세스의 종료 상태를 알 수 없다는 점에 유의하는 것이 중요합니다. .

초기화 함수에 다음 코드를 추가합니다.

signal(SIGCHLD, SIG_IGN);

관련 정보