라즈베리파이에서 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);