문제

CTRL-C가 눌러질 때까지 영원히 루프하는 매우 간단한 서버를 작성하고 있습니다. Ctrl-C의 신호 핸들러가 열린 소켓을 닫고 서버를 종료하고 싶지만 신호 핸들러의 범위가 무엇인지 모르겠지만 소켓을 선언하는 아이디어가 마음에 들지 않습니다. (s) 나는 글로벌에 가까워 야한다.

누군가 제안을 제공 할 수 있습니까? 이 작업을 수행하는 몇 가지 표준 방법이 있습니까?

도움이 되었습니까?

해결책

글쎄, 당신은 신호 핸들러가 있기 때문에, 나는 당신이 UNIX 변형에 있다고 가정 할 것입니다. 그렇다면:

  • 소켓은 파일 번호로 커널에 식별됩니다. 보다 socket(2).
  • 그 int는 귀하의 프로세스에 유효합니다
  • 그 int는 그것을 만든 후에 포크 된 모든 프로세스에 유효합니다.
  • execec가 아닌 경우 실행하는 프로세스에 유효합니다.

따라서 신호 처리기에서 완벽하게 유효합니다. 신호 핸들러를 알리는 방법은 사용 할 숫자가 작성하지 않은 언어에 따라 다릅니다. 거의 모든 언어로 작동하는 두 가지 접근 방식이 있습니다.

  • 제외해야 할 정리가 없다면 close 종료하고 출구로 전화하십시오. 또는 신호 조치를 기본값으로 설정하여 종료됩니다. 커널이 소켓을 닫습니다.
  • 깃발을 설정하여 (일반적으로 어떤 종류의 글로벌이 될 것임) Select/Poll 루프에 정리하고 종료하도록 지시하십시오. 프로그램의 다양한 부분이 신호 핸들러에서 호출 할 수 있는지 걱정할 필요가 없다는 점에서 유리합니다.

다른 팁

일반적으로 신호 처리기에서 아무것도하지 않는 것이 좋습니다. 깃발을 설정하는 것 외에.

그런 다음 컨트롤이 기본 루프로 돌아 오면이 플래그를 검사하고 루프를 종료하고 소켓을 닫고, 객체에서 파괴자를 실행하고, 깨끗하게 종료 할 수 있습니다.

신호 처리기는 C 또는 C ++ 라이브러리 통화 중간을 포함하여 거의 언제 어디서나 호출 할 수 있으며 문제가 될 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top