2011-08-03 3 views
3

두 개의 스레드 th1, th2가있는 데몬이 있습니다. th2는 read(2)을 사용하여 소켓을 읽습니다.두 개의 결과 SIGTERM을 처리하십시오.

SIGTERM으로 데몬을 종료하면 th1이 데몬 소멸자가 호출 된 후 신호를 포착하고 처리하여 (종료 플래그 설정) pthread_kill(th2, SIGTERM)을 호출합니다. 그러나 두 번째 스레드는 SIGTERM을받지 않으므로 종료되지 않습니다. 소켓이 데이터를 수신하고 read()에서 벗어나면 종료 플래그가 설정되어 실행이 완료됩니다.

pthread_kill(th2, SIGUSR2)을 호출 한 다음 pthread_kill(th2, SIGTERM)을 호출하면 모든 것이 올바르게 완료됩니다. 따라서 UNIX는 결과적으로 동일한 신호를 보내는 것을 허용하지 않는 것으로 보입니다.

이 문제는 운영 체제에 따라 결정됩니까? 지정된 스레드가 다른 스레드에서 SIGTERM을 수신하도록 할 수 있습니까?

+1

적절한 프로그래밍 언어 태그 (c, C++ 또는 yourLanguageHere)를 포함하면 더 많은 '눈'을 얻게됩니다. 행운을 빕니다. – shellter

+2

감사합니다. 태그를 추가했습니다. 나는 유닉스가 C를 의미한다고 생각했다. – vissi

+2

@vissi : 그건 틀렸다. 작업중인 언어의 태그 만 포함해야합니다. 귀하의 질문이 상호 운용성과 관련이 없다면 한 언어에만 태그를 붙여야합니다. – Puppy

답변

5

유닉스는 신호가 너무 가깝게 전송되거나 보류중인 신호가 전달되기 전에 추가 신호가 프로세스로 전송 된 경우에도 여러 개의 연속적인 신호를 프로세스로 전송할 수 있습니다. 단일 신호 이벤트.

pthread_kill()은 처리 할 특정 스레드에 신호를 보내지 만 신호의 실제 처리에는 전역 효과가 있습니다 (즉, 신호 처리기는 스레드가 아닌 프로세스 당 처리됩니다).

read()은 유효한 취소 지점이므로 명시 적으로 pthread_cancel()으로 전화를 걸 수도 있습니다. 필요한 경우 해지 핸들러를 추가 할 수 있으며 해지 안전하지 않은 함수를 사용하는 경우 스레드의 취소 상태를 차단할 수 있습니다. pthread_cancel()here에 대한 도움말을 읽을 수 있습니다.

+0

'sigaction()'과 SA_SIGINFO는 POSIX 실시간 신호 대기 행렬과 직각을 이룬다 - 실시간 의미를 "가능하게"한다고 말하는 것은 부정확하다. 더욱이 런타임시 이러한 의미 체계를 사용할 수 있음을 제안하는 것은 오해의 소지가 있습니다. 실시간 신호 (SIGRTMIN .. SIGRTMAX)는 대기열에 있지만 표준 신호에는 대기열이 없습니다. (spec은 허용되지만 실제로는 그렇지 않다.) – pilcrow

+0

그래, 내 혼란이 생겨서 ... specs에서 (구현 된 것보다는 리눅스에서 추측하고있다.) 표준처럼 보였다. 'sigaction()'을 사용하여 표준 시그널 타입을 위해 SA_SIGINFO를 설정한다면, 실시간 시그널과 함께 시그널도 큐에 넣을 수 있습니다. 이것을 명확히 해 주셔서 감사합니다 ... 나는 내 대답을 업데이트 할 것입니다. – Jason

1

비교적 오래된 학교이지만 효과적인 접근 방법은 select()와 파이프를 사용하여 모든 스레드에 신호를 다시 전달하는 것입니다. (차단 핸들에서 파이프 읽기 핸들을 선택()합니다).

관련 문제