udp 서버가 있는 데몬 프로그램을 실행 할 경우 희안한 문제가 있습니다.
안녕하십니까.
프로그래밍 업무를 하면서 난해한 문제에 봉착하였습니다.
프로그래밍 관련 정보는 다음과 같습니다.
0. 컴파일 정보
- OS : Centos 6.6
- gcc : 4.4.7
1. 프로그램 설명
- 프로그램 A : fork 또는 daemon 함수를 사용하는 udp 서버 데몬 프로그램 (서버포트 1111)
프로그램 B : 프로그램 A를 시작 종료하는 udp 서버 데몬 프로그램 (서버포트 2222)
- 프로그램 A와 프로그램 B의 udp 서버 기능은 각각 독립적인 기능 수행
2. 실행순서
- 프로그램 B 실행
- 특정 조건을 만족하면 프로그램 A를 재시작
- loop로 실행중인 프로그램 B 종료
3. 현상
- 프로그램 B가 종료한 경우 프로그램 B가 사용했던 udp 서버 포트를 프로그램 A가 실행 중
- 프로그램 B 종료 전
udp 0 0 xxx.xxx.xxx.xxx:1111 0.0.0.0:* 23951/A
udp 0 0 xxx.xxx.xxx.xxx:2222 0.0.0.0:* 23949/B
프로그램 B 종료 후
udp 0 0 xxx.xxx.xxx.xxx:1111 0.0.0.0:* 23951/A
udp 0 0 xxx.xxx.xxx.xxx:1111 0.0.0.0:* 23951/A
프로그램 B 종료 방법은 signal 9 또는 3을 주어 종료를 하였고 signal 3일 경우 서버 socket을 닫게 하였습니다.
또한 프로그램 B는 ps 명령으로 확인 결과 종료됬음을 확인 하였습니다.
참고로 udp 서버 소켓을 열고 닫는 함수는 공통으로 사용하거나 각각의 프로그램에서 열어 사용하게 하여 테스트를 하였습니다.
위 현상은 무슨 현상이며 정상인지, 아니면 해결할 수 있는 방법은 무엇인지 고수님들의 고견 부탁드립니다.
감사합니다.
자답 입니다.
다른 프로그램에서 다른 프로그램을 실행 할 경우 socket이 상속 된다는 점을 보지 못했습니다.
즉, 소캣을 생성 또는 소캣 디스크립터 번호를 close-on-exec으로 설정하여 사용해야 위 현상이 발생하지 않았습니다.
관심 가져주신 분들에게 감사하단 말씀 전해드립니다.
지식의 여인은 옷을 쉽게 벗지 않는다.
잡초인생. 잡초처럼 끈길기게....
잘 봤습니다. 알아 둘 필요가 있는 내용이라고
잘 봤습니다. 알아 둘 필요가 있는 내용이라고 생각됩니다.
댓글 달기