2014-01-24 2 views
1

죽기 직전 소켓을 닫으려면 어떻게해야합니까? 리눅스에 TCP 서버를 만드는 서비스가 있습니다. 때로는 다시 시작해야하고 소켓이 정말로 닫혀 있어야합니다. 그 순간에 멈 춥니 다. SIGKILL을 처리 할 수 ​​없다는 것도 알고 있습니다. 누구나 올바른 방향으로 나를 가리킬 수 있습니까?C++ : SIGKILL 수신시 TCP 소켓 (서버)을 닫는 방법

답변

4

소켓이 종료됩니다 - 자동으로 수행 할 OS는 다음을 참조하십시오 Using SO_REUSEADDR - What happens to previously open socket?

을 대신 SIGKILL을 처리하기 위해 노력하는, 일을 시작할 때 문제가 해결되지 것이다 :

사용 SO_REUSEADDR가 socket 옵션을 사용하면 포트를 즉시 재사용 할 수 있습니다.

+0

고마워요. 나는 추가했다 : 'int optval = 1; \t setsockopt (양말, SOL_SOCKET, SO_REUSEADDR, & optval, sizeof optval);' – JosephITA

0

SIGKILL에서는 아무 것도 할 수 없습니다. 서비스를 종료하고 소켓을 닫으려면 SIGTERM 및/또는 SIGINT를 처리해야합니다.

  1. 응용 프로그램이 정말 SIGTERM 및 SIGINT
  2. 시스템을 무시하고 당신이 당신의 서비스를 다시 시작하고 싶을 때 당신은 SIGTERM을 보내야

즉시 응용 프로그램을 종료 할 필요가없는 한 SIGKILL을 보낼 필요가 없습니다

또는 SIGKILL 대신 SIGINT를 사용하십시오.

+0

좋아요, 나는 SIGINT에 처리기를 추가합니다 (SIGTERM이 아직 처리되었습니다). 나는 upstart에서 재시동을 사용하여 서버를 비활성화하고 다시 활성화합니다. – JosephITA