2013-10-11 2 views
0

코드베이스에는 fork()와 SIGCHLD 설치를 통해 임의의 양의 외부 프로그램을 실행하고 종료 코드를 모니터링 할 수있는 소프트웨어가 있습니다 매니저. 유닛 테스트 케이스에서이 소프트웨어는 잘 작동합니다.popen과 SIGCHLD 처리기를 병렬로 작동 시키려면

그러나이 포크 "서버"를 실행하는 프로세스는 여러 스레드에서 많은 소프트웨어 모듈을 실행 중입니다. 불행히도이 소프트웨어의 한 부분은 자체 SIGCHLD 처리기를 사용해야하는 popen()을 사용하고 있습니다. 우리가 볼 수있는 결과는 errno ECHILD를 사용하여 pclose()를 호출 할 때 프로그램이 실패한다는 것입니다.

SIGCHLD 처리기와 popen/pclose에 대한 호출을 동시에 사용할 수 있습니까?

답변

1

fork() 후에 신호 핸들러가 상속됩니다. 따라서 레거시 소프트웨어를 호출하기 전에 먼저 child 프로세스에서 SIG_DFL과 함께 signal()을 사용하여 fork()와 exec() 사이의 기본값으로 재설정해야합니다.