[Solaris8] 프로그램 종료 후 CLOSE_WAIT상태

yeuri의 이미지

현재 tcp/ip 를 이용해서 클라이언트 서버 프로그램을 짜고 있습니다.

서버 쪽을 SIGTERM (ctrl-c) 으로 종료 시켰을때 기존에 생선된

포트가 CLOSE_WAIT 상태로 남아있는 경우가 있습니다.

CLOSE_WAIT 상태가 되었다가 다시 복구되는 시점도 다양합니다. 어떤 이유에서 일까요?

프로세스가 종료되도 사용되던 SOCKET 이 이렇게 남아있는 경우가 원래 있는 건가요?... 특별한 처리를 해줘야 되는지 알고 싶습니다.

도와주세요..

Seven..의 이미지

SIG_INT를 핸들링 해서;
소켓을 닫고 종료하도록 처리해주면
어떨까요?

VENI VIDI VICI

pynoos의 이미지

FAQ에 가까운 질문입니다.

맨 위 검색에서 CLOSE_WAIT으로 검색해 보셔요..

많이 검색 됩니다. :)

yeuri의 이미지

아 .. 네 .. 검색해 보고 저 상황이 내 상황이 아닐꺼야 하고 생각해서 글을 쓴건데.. 다시 곰곰히 생각해 보니 비슷한것도 같습니다. 다시 한번 머릴 싸메고 공통점을 찾아보겠습니다. ^^

I don't know what you know.

yeuri의 이미지

질문입니다. 스티븐슨의 책을 보면 CLOSE_WAIT상태에서 갈 수 있는 상태는 APPLICATION 이 CLOSE 를 호출했을때 가는 LAST_ACK 상태 뿐이라고 알고 있습니다. 그럼 APPLICATION 이 close() 해 주지 않으면 어떻게 되나요? 커널이 알아서 소켓을 수거해 주는 건가요?.. 보통때 서버에서 ctrl-c 해서 나가도 소켓이 잘 사라지는 걸로 봐선 그런거겠지요?.. 에고고.. 지금은 다시 에러를 내기 위해 노력하고 있습니다. ㅜㅡ

I don't know what you know.

arimae의 이미지

Application 이 종료 될때는 커널이 알아서 socket을 close 해줍니다.
하지만, application이 종료되지 않았을 때는 그 상태로 계속 남아있게 되고, 결국 그 소켓은 완전히 닫혀질때까지 다시 사용하지 못하게 됩니다.

Dream, Passion and Challenge..

yeuri의 이미지

하지만 제 프로그램은 이미 종료되었는걸요..

I don't know what you know.

pynoos의 이미지

문서의 상태 천이도를 잘 보시면, CLOSE_WAIT 은 close 를 기다리는 상태임을 알 수 있습니다. 이 상태에서 프로세스가 종료하면 소켓 상태를 종료시킬 것인지 일정시간 둘 것인지는 구현 나름입니다.

따라서 되도록, recv 를 통해 close 되어야한다는 것을 알았을 때는 바로 close 하도록 프로그램을 확인하셔야합니다. 아마 해당 소켓을 다른 프로세스와 공유하고 있는지도 확인 해보시기 바랍니다.

lsof -n

를 사용하면 어떤 프로세스가 어떤 소켓을 잡고 있는지 확인할 수 있습니다.

yeuri의 이미지

pynoos 님이 알려주신 lsof 를 사용해서 원인을 알아냈습니다.

우선 고맙다는 말을 먼저 드리구요..

원인은 fork 에 있었습니다.

connection 이 맺어져 있는 상황에서 fork 를 해서 httpd 를 실행 시켰는데 이넘이 커널레벨에서 열려져 있던 socket 을 계속 가지고 있더군요..

따라서 제 프로그램이 죽어도

다른 프로그램이 아직 존재하기 때문에 소켓을 없애지 못했던 거였습니다.

이제 어떻게 해결할까를 알아봐야 겠습니다.

전에 close_all() 이라는 함수를 본것 같은데.. 그런건 solaris 에 없는가 보내요..

기존에 열려있던 descriptor 를 fork 된 프로세스에서 쉽게 닫을 수 있는 방법 없을까요?

암튼 답변 주신 모든 분들 다시 한번 감사합니다.

I don't know what you know.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.