습관처럼 썻던 fork에 질문을 드립니다..

shean0의 이미지

int main(int argc,char *argv[])
{
  if((server_fd=socket(PF_INET, SOCK_STREAM, 0)) <0) ..
 while(1)
 {
   if( (client_fd=accept(server_fd,(struct sockaddr *)&client_addr,&cli_len)) < 0 )...

   if((pid=fork())>0)/*parents*/
   {
       close(client_fd);   /* 이것을 해도 되는 이유가??*/
       ..
       continue;
    }
    else
    {
         close(server_fd);
         call_child_main(client_fd);
         close(client_fd);
         exit(1);
     }
   }
}

이런식으로 짯었는데... fork이후에 부모가 client_fd를 close하는데..물론
fork되었으니, 다른 프로세스여서 &#44318;찮다고 생각하고 있었습니다..
그런데.. 요즘 close때문에 고민을 하다보니...
여기 부모에서 close(client_fd)를 하면, client와의 연결이 끊어지지 않는가??
왜..라는 의문이 들어서 지금 다시 책을 보고 있습니다...

조언을 부탁드립니다..

kkuokk의 이미지

최초 파일 디스크립터(이하 fd)를 획득하면 해당 프로세스에서 이 fd대한 참조 개수기 카운터가 1이 됩니다.

물론 일반적인 프로그램에서 이렇게 됩니다.

하지만 fork를 통한 프로세스 복제를 하면 새로운 자식 프로세스와 기존의 어미 프로세스로 분할이 되지요..

이러면서, 모든 열려 있는 fd에 대한 참조개수기 값(이 fd를 참조 하고 있는 프로세스의 갯수)이 +1 증가 하게 됩니다.

그래서, 일반적으로 fork 후 이 참조 개수기 값을 -1 시키기 위해 어미 프로세스에서는 close를 호출하게 됩니다..

그럼 참조 개수기가 1이 되면서...

클라이언트에서 해당 fd를 사용하고 있다가. close를 호출하면 다시 참조 개수기 값이 0이 되면서 정상적인 close 루틴이 수행 됩니다.

즉 참조 하고 있는 것 만큼 close를 콜해서 참조 개수기 값이 0이 되어야
실제 close가 된다는 것입니다..

즉, 참조 개수기 값을 감소 시키기 위해.. 어미 프로세스에서 fork 후 close를 호출하는 것입니다.

사족으로, shutdown함수를 사용할 경우 참조 개수기 값과는 무관하게
close에 관련된 루틴이 실행 됩니다.

즉 참조 개수기 값이 1보다 큰값이라고 할지라도 shutdown(2);(양방향 닫기)를 호출하면 참조개수기 값에 상관없이 해당 fd를 닫습니다.

^^ 신바람 꺽이왕자~~~~

unixguy의 이미지

이런 형태의 iterative (반복형) 서버에서는 반드시 클로즈를 해야됩니다. 안하고 서버를 계속 돌리게 되면 금방 문제가 보일텐데 그 이유는 부모프로세스의 화일테이블이 꽉 차서 더 이상 fd 를 생성할 수가 없기 때문입니다. stdio.h 의 OPEN_FILE_MAX 비슷한 이름에 대해서 공부를 ...

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.