2011-05-10 1 views
1

SIGINT 시그널을 처리하기 위해 생성 된 함수가 상수 루프에 갇혀 있습니다. 아이디어는 CTRL-C를 부모 프로세스가 무시하도록하지만 자식 프로세스로 보냄으로써 기본값으로 처리합니다. CTRL-C를 누르면 신호 처리기 함수가 호출되지만 무한 루프에 빠지게됩니다. kill 호출은 보낸 사람 프로세스를 제외한 프로세스 그룹의 모든 프로세스에 SIGTERM을 보내야합니다. 어떤 도움을 주시면 감사하겠습니다.시그널 핸들러 함수가 루핑을 계속합니다.

기능 코드는 다음과 같습니다

void intHandler(int signum) { 
kill(0, SIGTERM); 

} (주)에

함수 호출 코드는 다음과 같습니다 킬 (kill) 매뉴얼 페이지에서

(void) sigset(SIGINT, intHandler); 
+0

"보낸 사람 프로세스를 제외하고"- 사양에서 말하는 것은 아닙니다. SIGTERM을 차단하거나 프로세스 그룹에서 프로세스를 제거해야합니다. –

+0

또는 전역에서 자식을 추적하고 모든 프로세스 대신 명시 적으로 자식을 "종료"합니다. IIRC에서는'sigaction'을 사용하여 부모가 SIGTERM을 무시하고 자식을 차단 해제 할 수 있습니다. –

+0

나는 당신이 말한 것과 똑같이 일을 끝내었고 그것이 필요한만큼 정확하게 작동합니다. 고마워요. – zetatr

답변

2

.

PID가 0 인 경우, SIG는 그 프로세스 그룹 ID 프로세스가 권한이 프로세스 그룹 송신자의 ID, 및 대 같다 (시스템 프로세스 불특정 세트를 제외한) 모든 프로세스로 전송한다 신호를 보냅니다. 보낸 사람에게 신호를 전송하지에 대한

아무것도, 그래서 당신은 가장 가능성 같은 것을 원하는 : 이것은 보낸 사람에 신호 핸들러를 재설정합니다

void intHandler(int signum) { 
    sigset(SIGINT, SIG_DFL); 
    kill(0, SIGTERM); 
} 

는 모든 회원들에게 SIGTERM을 전송하기 전에 기본값으로 프로세스 그룹.

+0

아, 알았어요. 그 코드가 여전히 부모 프로세스를 종료하지 않을까요? 나는 자식 프로세스를 계속해서 죽이기 위해서 부모 프로세스가 필요하다. – zetatr

+0

전역 변수를 사용하여 하위 프로세스 PID를 추적하기로 결정했습니다. – zetatr

+0

음, SIGINT 신호 처리기를 재설정해도 SIGTERM이 프로세스를 종료하지 않습니다. –