2009-05-30 2 views
1

이것은 설계 결정에 관한 내용이며 다른 서비스를 채택 할 때 고려해야 할 부분과 단점을 이해하고 있습니다. 그래서 두 개의 무관 한 서버를 가진 두 개의 서비스가 있습니다. 하나는 포트 10000에서 수신하고 다른 하나는 3 개의 다른 포트를 통해 3 개의 다른 요청에 응답하는 xinetd 서버입니다 (클라이언트는 nc 서버 port1 | port2 | port3를 사용하여 데이터를 검색합니다).신호 처리 결함 재정의

언젠가는 보안 문제로 인해 xinetd 서버가 중단되어야하며 첫 번째 서버가 동일한 데이터를 보존하기 때문에 우리는 USR1 신호를 첫 번째 서버에 보내 xinetd 서버를 채택하고 공개 데이터. 따라서 첫 번째 서버에서 신호 처리를 재정의하는 논리를 추가해야 할 필요가 있습니다. 예를 들어, xinetd 서버에서 kill -10 first_server를 사용하면 이전 서버가 사용했던 것과 동일한 데이터를 첫 번째 서버에서 뱉어 낼 수 있으며 첫 번째 포트로 계속 덤프 할 수 있습니다 (USR1 (10, 16 및 30) . 논쟁은 유닉스 신호 사용을 남용하고 물론 POXIS와 리눅스가 미리 정의한 10, 16, 30 시그널 동작을 재정의했기 때문에 이것은 나쁜 설계이다. 이것은 기술적으로 정말로 나쁜 것인가? 시스템에 어떤 해가 끼칠 것입니까?

답변

1

10은 SIGBUS입니다. 버스 오류입니다. 아마도 그 버스를 만지지 않아야 할 것입니다. 30 및 31은 SIGUSR1 및 SIGUSR2이며 사용자 정의이며 특정 용도로 예약되지 않았습니다. 16은 필요없는 SIGURG의 소켓 데이터입니다. 그러나 실시간 신호를 31 이상 사용하는 것이 좋습니다.

+0

입니다. 그것은 많은 의미가 있습니다. 사용되지 않는 signum을 사용하도록 변경하면이 경우 전반적으로 IPC를 처리하는 데 신호를 보내는 것이 좋은가요? – jimx

+0

좋은 신호 (폴링 할 필요가 없음)와 나쁜 신호 (신호를 처리하려고한다면 errno == EINTR를 확인해야 함)가 인터럽트 작동을 지시합니다. 앱에 대해 더 많이 알지 못하면 말하기가 어렵습니다. – Dave

+0

우리의 응용 프로그램은 rpc 서버이며 SIGTERM (정상적인 정지, 여분의 내부 정리 작업) 및 SIGHUP (설정 및 로그 다시로드)을 다르게 처리합니다. 모든 SIG가 sys 기본값으로 사용됩니다. 인수 중 하나는 신호가 정보를 전송하는 대신 내부 상태를 변경하는 프로세스에만 알리는 데 사용해야한다는 것입니다.이 경우에는 RPC 호출을하는 것과 같은 일종의 일이지만, 서버에서 수신하는 것을 원하지 않습니다. 여분의 3 개 포트에. – jimx