2012-06-09 6 views
5

원격 호스트에 소켓 연결을 유지하려고 시도하는 pthread을 생성하는 코드가 있습니다. 연결이 끊어지면 소켓의 블로킹 connect() 호출을 사용하여 다시 연결을 시도합니다. 코드가 별도의 스레드에서 실행되기 때문에 동기 소켓 API를 사용한다는 사실에 대해서는별로 신경 쓰지 않습니다.차단 소켓 연결을 수행하는 스레드를 인터럽트하는 방법은 무엇입니까?

즉, 내 응용 프로그램을 종료 할 때까지입니다. 질서 정한 종료의 모습을하고 싶습니다. 그래서 스레드 동기화 프리 머 티브를 사용하여 스레드를 깨우고 종료 신호를 보내고 스레드가 완료 될 때까지 기다리는 pthread_join()을 수행하십시오. 이것은 종료 명령을 내릴 때 스레드가 connect() 호출 중간에 있지 않는 한 위대한 기능입니다. 이 경우 연결 시간이 초과 될 때까지 기다려야하는데 시간이 오래 걸릴 수 있습니다. 이로 인해 응용 프로그램이 종료되는 데 오랜 시간이 걸리는 것처럼 보입니다.

내가 무엇을하고 싶은지 어떤 식 으로든 connect()에 대한 호출을 중단하는 것입니다. 호출이 돌아 오면 스레드는 내 종료 신호를 알아 차리고 정상적으로 종료합니다. connect()은 시스템 호출이기 때문에 의도적으로 신호를 사용하여 인터럽트를 할 수 있다고 생각했기 때문에 (이 경우 호출은 EINTR을 반환합니다) POSIX 스레드 환경에서 강력한 방법인지는 확실하지 않습니다.

누군가 신호를 사용하거나 다른 방법을 사용하여이를 수행하는 방법에 대한 권장 사항이 있습니까? 참고로, 수정할 수없는 일부 라이브러리 코드에서는 connect() 호출이 중단되므로 비 블로킹 소켓으로 변경하는 것은 옵션이 아닙니다.

+2

언어 태그도 붙여주세요. – Tudor

+0

저는 실제로 파이썬으로 글을 쓰고 있습니다 만, 나는 언어에 구애받지 않는 어떤 것도 찾고 있지 않습니다. 내가 리눅스에서 작동한다고 가정 할 수 있습니다. –

+1

소켓을 닫습니다. –

답변

6

을 닫으십시오. ()을 중단하려면 소켓을 닫으십시오 (). 확실하지는 않지만 적어도 Linux에서는 작동 할 것이라고 생각합니다. 물론 소켓을 한 번만 또는 두 번째로 close() close() close()가 방금 열린 비 관련 파일 설명자를 이론적으로 닫을 수 있도록 적절하게 동기화해야합니다.

편집 : 실제로 소켓을 닫지 않기 때문에 종료()이 더 적합 할 수 있습니다.

또는 pthread_cancel()pthread_kill()을 살펴볼 수도 있습니다. 그러나 경쟁 조건없이이 두 가지를 사용하는 방법은 없습니다.

다중 스레드 서버 접근 방식을 포기하고 대신 이벤트 통보를 위해 epoll을 사용하여 이벤트 중심으로 진행하는 것이 좋습니다. 이렇게하면 적절한 종료와 같이 스레드로 매우 어려워지는 이러한 모든 기본적인 문제를 피할 수 있습니다. 원하는 때에 언제든지 자유롭게 할 수 있습니다. 소켓을 안전하게 닫고 다시는 소리를들을 수 없습니다. 한편

, 당신의 작업자 스레드에서 당신은 (또는)() (를 연결하고 epoll_pwait을 통해 통보를받을 비 - 블로킹 (non-blocking) ppoll을 할 경우() 또는 위해 pselect()하며 페이지를 참고) 신호와 관련된 경쟁 조건을 피할 수 있습니다.

+0

'close()'를 사용해 주셔서 감사합니다; 나는 그것을 볼 것이다. 나는 이벤트 중심 메커니즘이 더 좋을 것이라는데 동의한다.그러나 필자가 궁금해했듯이 "수정할 수없는 라이브러리 코드에서는'connect()'호출이 중단되어 비 블로킹 소켓으로 변경하는 것은 옵션이 아닙니다." –

+0

"수정할 수 없습니다"부분은 여기서 큰 문제가되어야합니다. 앞에서 언급했듯이 두 번 닫지 않도록 조심하십시오. connect()가 반환 된 후에 라이브러리가 close()를 원할 수 있습니다. 당신은 당신이 모든 것을 다 끝냈을 때 강제로 프로세스를 종료하는 것으로 간주 했습니까? 그 시점까지 침입 코드가 오작동하지 않았는지 확인하십시오. –

+2

당신의 제안에 따라'shutdown()'을 사용했습니다. 라이브러리는 파이썬으로 작성되었으므로 필자는 엿볼 수 있고 기본 소켓에 액세스하여 이후에 종료 할 수 있습니다. 잘 작동한다. 소프트웨어 아키텍처의 관점에서 볼 때 가장 좋은 접근법은 아니지만 여기에서 작동하며 사용되는 라이브러리 버전을 제어 할 수 있습니다. –

관련 문제