[Solaris8] 프로그램 종료 후 CLOSE_WAIT상태
글쓴이: yeuri / 작성시간: 월, 2004/04/12 - 10:01오후
현재 tcp/ip 를 이용해서 클라이언트 서버 프로그램을 짜고 있습니다.
서버 쪽을 SIGTERM (ctrl-c) 으로 종료 시켰을때 기존에 생선된
포트가 CLOSE_WAIT 상태로 남아있는 경우가 있습니다.
CLOSE_WAIT 상태가 되었다가 다시 복구되는 시점도 다양합니다. 어떤 이유에서 일까요?
프로세스가 종료되도 사용되던 SOCKET 이 이렇게 남아있는 경우가 원래 있는 건가요?... 특별한 처리를 해줘야 되는지 알고 싶습니다.
도와주세요..
Forums:
..
SIG_INT를 핸들링 해서;
소켓을 닫고 종료하도록 처리해주면
어떨까요?
VENI VIDI VICI
FAQ에 가까운 질문입니다.맨 위 검색에서 CLOSE_WAIT으로
FAQ에 가까운 질문입니다.
맨 위 검색에서 CLOSE_WAIT으로 검색해 보셔요..
많이 검색 됩니다. :)
---
http://coolengineer.com
아 .. 네 .. 검색해 보고 저 상황이 내 상황이 아닐꺼야 하고 생각해
아 .. 네 .. 검색해 보고 저 상황이 내 상황이 아닐꺼야 하고 생각해서 글을 쓴건데.. 다시 곰곰히 생각해 보니 비슷한것도 같습니다. 다시 한번 머릴 싸메고 공통점을 찾아보겠습니다. ^^
I don't know what you know.
질문입니다. 스티븐슨의 책을 보면 CLOSE_WAIT상태에서 갈 수 있는
질문입니다. 스티븐슨의 책을 보면 CLOSE_WAIT상태에서 갈 수 있는 상태는 APPLICATION 이 CLOSE 를 호출했을때 가는 LAST_ACK 상태 뿐이라고 알고 있습니다. 그럼 APPLICATION 이 close() 해 주지 않으면 어떻게 되나요? 커널이 알아서 소켓을 수거해 주는 건가요?.. 보통때 서버에서 ctrl-c 해서 나가도 소켓이 잘 사라지는 걸로 봐선 그런거겠지요?.. 에고고.. 지금은 다시 에러를 내기 위해 노력하고 있습니다. ㅜㅡ
I don't know what you know.
Application 이 종료 될때는 커널이 알아서 socket을 clo
Application 이 종료 될때는 커널이 알아서 socket을 close 해줍니다.
하지만, application이 종료되지 않았을 때는 그 상태로 계속 남아있게 되고, 결국 그 소켓은 완전히 닫혀질때까지 다시 사용하지 못하게 됩니다.
Dream, Passion and Challenge..
하지만 제 프로그램은 이미 종료되었는걸요..
하지만 제 프로그램은 이미 종료되었는걸요..
I don't know what you know.
문서의 상태 천이도를 잘 보시면, CLOSE_WAIT 은 close 를
문서의 상태 천이도를 잘 보시면, CLOSE_WAIT 은 close 를 기다리는 상태임을 알 수 있습니다. 이 상태에서 프로세스가 종료하면 소켓 상태를 종료시킬 것인지 일정시간 둘 것인지는 구현 나름입니다.
따라서 되도록, recv 를 통해 close 되어야한다는 것을 알았을 때는 바로 close 하도록 프로그램을 확인하셔야합니다. 아마 해당 소켓을 다른 프로세스와 공유하고 있는지도 확인 해보시기 바랍니다.
lsof -n
를 사용하면 어떤 프로세스가 어떤 소켓을 잡고 있는지 확인할 수 있습니다.
---
http://coolengineer.com
pynoos 님이 알려주신 lsof 를 사용해서 원인을 알아냈습니다.
pynoos 님이 알려주신 lsof 를 사용해서 원인을 알아냈습니다.
우선 고맙다는 말을 먼저 드리구요..
원인은 fork 에 있었습니다.
connection 이 맺어져 있는 상황에서 fork 를 해서 httpd 를 실행 시켰는데 이넘이 커널레벨에서 열려져 있던 socket 을 계속 가지고 있더군요..
따라서 제 프로그램이 죽어도
다른 프로그램이 아직 존재하기 때문에 소켓을 없애지 못했던 거였습니다.
이제 어떻게 해결할까를 알아봐야 겠습니다.
전에 close_all() 이라는 함수를 본것 같은데.. 그런건 solaris 에 없는가 보내요..
기존에 열려있던 descriptor 를 fork 된 프로세스에서 쉽게 닫을 수 있는 방법 없을까요?
암튼 답변 주신 모든 분들 다시 한번 감사합니다.
I don't know what you know.
댓글 달기