프로그램 종료시 수동으로 지정번호를 닫아주지 않는경우..

superkkt의 이미지

스티븐 아저씨의 네트웍 프로그래밍 책을 보고있습니다. 이거 보기전에 APUE 볼때도 그런 예제가 있었는데 프로그램 종료시 자동으로 커널이 파일 디스크립터나 메모리를 반환하는걸 이용해서 수동으로 지정번호를 닫거나 메모리를 반환하지 않는 프로그램이 있습니다.

이 방법이 좋은건가요? 아니 좋다 나쁘다로 물어보면 좀 이상한것같고.. 이렇게 수동으로 해주지 않았을경우 뭔가 문제가 발생할 소지가 있나요?
그리고 실무에서 프로그램을 짜실때 이런 방법을 이용하기도 하나요?

chadr의 이미지

수동으로 닫지 않아도 운영체제에서 알아서 회수해주므로 큰 상관은 없겠습니다만.. 만약에 해당 프로그램이 확장이 되거나 좀 더 복잡해지거나 할때 할당과 해제의 쌍을 맞춰놓지 않으면 나중에 고생하게 됩니다.. 기존 코드늘 c&p할때 더 그렇겠지요... :)

그리고 수동으로 닫아주는 제 습관의 한가지 더 이유는 프로그램의 로직상 생성이 있으면 해제도 있어야한다! 라는 개인적인 고집때문이기도 합니다.. :oops:

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

superkkt의 이미지

chadr wrote:
수동으로 닫지 않아도 운영체제에서 알아서 회수해주므로 큰 상관은 없겠습니다만.. 만약에 해당 프로그램이 확장이 되거나 좀 더 복잡해지거나 할때 할당과 해제의 쌍을 맞춰놓지 않으면 나중에 고생하게 됩니다.. 기존 코드늘 c&p할때 더 그렇겠지요... :)

그리고 수동으로 닫아주는 제 습관의 한가지 더 이유는 프로그램의 로직상 생성이 있으면 해제도 있어야한다! 라는 개인적인 고집때문이기도 합니다.. :oops:

c&p가 뭔가요?

======================
BLOG : http://superkkt.com

익명 사용자의 이미지

copy & paste

cinsk의 이미지

한 번 작업을 처리하고 종료하지 않는 daemon 성격을 띤 프로그램에서, 여러 파일을 수시로 읽을 필요가 있을 경우, 제 때 file descriptor를 닫아 주지 않으면, 언젠가 "한 프로세스가 동시에 열 수 있는 파일의 갯수" 제한에 걸려서 더 이상 파일을 열 수 없는 상황이 될 것입니다. 이런 것을 막기 위해, 항상 더 이상 필요치 않은 파일 descriptor나 memory와 같은 resource를 닫는 습관을 기르는 것입니다.

또 다른 예로, 수동으로 모두 file descriptor를 닫는 경우는 보통 fork()/exec()를 수행하는 프로세스에서, (일반적으로 stdin, stdout, stderr를 남기고 나머지는 모두 닫혀 있다고 가정하기 때문에), child process를 위해 닫는 경우가 있습니다.

특별한 경우가 아니면, 필요할 때 할당하고 필요없을 때 해제하는 습관을 기르는 것이 좋으며, stdin, stdout, stderr와 같이, 프로세스 시작부터 끝까지 전반적으로 쓰이는 것이며, resource가 부족하지 않을 경우에는 궂이 해제하지 않아도 무방합니다.

다만 이럴 경우, resource leak를 검사하는 툴과 함께 쓸 때에는, 필요치 않는 경고 메시지를 보는 경우가 종종 있습니다. (물론 툴에 따라 다르지만, 이런 경고를 끄는 기능도 있으므로 큰 지장은 없습니다.)

댓글 달기

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