서버 프로세스에 signal이 들어오면 연결된 클라이언트들에게 종료 프로토콜을 보내고 안정적으로 종료시켜야 할 필요성을 느꼈다.

시그널 핸들러에 들어갈 수 있는 인자는 시그널 숫자인 int 형 하나만 들어갈 수 있다. 그래서 보통 전역변수를 이용해서 서버를 종료시키기 위한 값을 설정해서 종료시킨다.

하지만 싱글톤(Singleton) 이라는 기법을 이용하면 전역변수가 없어도 어디서든 접근할 수 있는 객체를 만들 수 있다. 그리고 그 객체는 무조건 하나만 존재할 수 있다.

유지보수에 좋을지 모르겠지만 궁금하니까 한번 써보자!

signal이 들어와서 종료시켜야할 때 목표는 2가지다.

  1. 연결된 클라이언트들에게 시그널 정보를 담은 종료 프로토콜 메시지를 보내고 연결을 끊게 한다.
  2. Server 객체의 status를 off 시켜서 false로 만든 다음 루프문을 빠져나오게 한다. 그렇게 소멸자를 통해 서버를 안정적으로 종료시키는 것이다.

싱글톤 객체에 Server 객체에 접근할 수 있는 포인터를 담아서 어디서든 Server 객체에 접근할 수 있게 하면 된다. Server 객체가 Protocol 객체에도 접근할 수 있으므로 프로토콜도 보낼 수 있다.

그렇게 만든 Singleton class는 아래와 같다.

Server 포인터를 담을 수 있는 Singleton class의 모습

Server 포인터를 담을 수 있는 Singleton class의 모습

getInstance()라는 static 멤버함수 안에 Singleton 객체를 static으로 선언했다. 프로세스 생성 초기에 Singleton 객체가 생성되고 언제든 이 static 멤버함수를 호출하면 사용할 수 있다.