좀비를 없애는 법?

Seven..의 이미지

int pid=fork();
while(1)
{
     ...처리할일이 생기면...
     if(pid==0)
     {
          ...처리하고...
          exit(0);
     }
     ...다른 처리...
}

이런 식의 코드를 짜게 되면..
처리할일이 생기면.. 자식이 처리하고 종료하는데
계속 defunct가 쌓이게 되더군요;;
자식이 죽을때 defunct를 남기지 않고 죽이려면..
어떻게 하면 좋을까요?

자식을.. 죽인다 -_- 조금 잔인하네요 -0-

cdpark의 이미지

SIG_CHLD에 대한 handler를 만들어주세요.

Seven..의 이미지

음음..

SIGCHLD에 대한 핸들러를 만드니..
자식이 죽을때 17번이 넘어오네요;; 그건 알겠는데;;
그렇다면.. 부모는 자식의 pid를
뭐 링크드 리스트라던가.. 이런걸로 관리를 해야 하는건가요?

그래서 SIGCHLD가 올때마다
죽 검색해보며 자식이 살아있는지 죽었는지 보고
죽었으면, 종료되거나 멈춘 상태라면
죽이는 형식으로 진행되는건가요?

waitpid라는 함수는
넌블러킹 함수인가요?

자식의 pid를 한번 죽 돌려보면서
child_pid가 반환되는 자식은..
어떻게 죽여야 하는지..

글이 너무너무 두서가 없네요 -0-

VENI VIDI VICI

progcom의 이미지

각각의 자식 프로세스의 상태를 관리할 필요가 있다면 따로 관리 풀을 만들어야겠지만, 굳이 필요 없다면 그냥 waitpid로 잘 받았다고 확인만 해주면 됩니다. (man waitpid를 한번쯤 살펴보세요. 자식 프로세스의 번호를 알 필요가 없을 경우에는 어떻게 해야하는지 나와있을겁니다)

waitpid는 "wait"라는 말 답게 블러킹함수입니다.

sangwoo의 이미지

참고입니다만.. SIGCHLD의 핸들러를 SIG_IGN으로 설정하시면,
알아서 child가 좀비가 되는 것을 막아줍니다.
하지만 이것은 BSD 계열의 익스텐션이므로 포터블한 프로그램에서는
사용하지 않는 편이 좋습니다. 리눅스에서는 잘 작동했던 기억입니다.

----
Let's shut up and code.

Seven..의 이미지

sangwoo wrote:
참고입니다만.. SIGCHLD의 핸들러를 SIG_IGN으로 설정하시면,
알아서 child가 좀비가 되는 것을 막아줍니다.
하지만 이것은 BSD 계열의 익스텐션이므로 포터블한 프로그램에서는
사용하지 않는 편이 좋습니다. 리눅스에서는 잘 작동했던 기억입니다

SIGCHLD는 기본값이 SIG_IGN라고 써있는걸 봤는데
아닌가 보네요;;
child가 알아서 죽네요 -0-

정확히 어떻게 구현이 저렇게 되는지는 모르겠지만..

자식이 부모에게 시그널을 보내고
기본설정이 어떻길래 좀비로 남는건지 모르겠네요;;

여튼! 좀비가 사라지니 너무 행복합니다 감사해요^^

VENI VIDI VICI

최종호의 이미지

progcom wrote:

...
waitpid는 "wait"라는 말 답게 블러킹함수입니다.

세번째 인자인 options에 WNOHANG 을 주면 non-blocking으로 동작합니다.

child가 죽으면 SIG_CHLD가 뜨니까 waitpid()를 blocking 모드로 불러도

죽은 child -_- 가 기다리고 있으니까 대부분 문제가 없겠지만,

Posix 시그널 semantics에 따르면 reliable한 시그널이 제공되지 않는 경우에는

해당 시그널 핸들러가 수행되는 도중 발생하는 동일한 시그널에 대해서는

두개 이상 큐잉되는 것을 보장하지 않습니다.

이게 문제되는 경우가, 여러개의 child가 충분히 짧은 시간안에 와장창 죽는 경우

SIG_CHLD 핸들러에서 해당 이벤트들을 충분히 빨리 처리하지 못한다면

손실되는 SIG_CHLD가 있을 수 있다는 것이죠.

SIG_CHLD에 의존해서 resource를 해제하는 경우에는 좀비 뿐만이 아니라

자원의 leak까지 발생할 수 있는 가능성이 있고요.

간단한 샘플 프로그램을 작성하셔서 확인해 보시면

충분히 가능한 시나리오라는 것을 아실 수 있습니다.

Stevens 의 Unix Network Programming vol. 1 2판의 5.8, 5.9, 5.10 절에

이와 관련된 설명이 나와있습니다.

Stevens가 제시한 해법은,

SIG_CHLD 핸들러가 호출됐을 때 더 이상 child가 없을 때까지

waitpid()를 호출하는 것입니다.

이렇게 하기 위해서는 waitpid()를 non-blocking으로 부를 수 있는 방법이 있어야겠죠.

(그렇지 않으면 child를 다 wait한 상태에서 그 다음에 부른 waitpid()에서 bloking이 될테니까요.)

코드는 간단합니다.

void
sig_chld(int signo)
{
    pid_t    pid;
    int        stat;
    
    while ((pid = waitpid(-1, &stat, WNOHANG)) > 0)
           /* any book-keeping code here */ ;
    return;
}

signal 관련 함수도 Posix 계열 signal 함수를 사용하는 것이 좋겠죠?

gostop의 이미지

흠..저도 잘은 모르지만..
자식 프로섹스가 종료됐다고 해서 바로 종료가 되는게 아닙니다.
운영체제(커널)에게서 자식프로세스의 종료시 리턴값을 부모프로세스가 받아가기 전까진 메모리에 남아있습니다.
그러므로 부모프로세스가 그에대한 적절한 처리를 해주지 않으면 좀비가 되는걸로 알고 있습니다.

arimae의 이미지

제가 알기로는 자식 프로세스가 죽었을때, 부모가 처리를 해주지 않으면 좀비가 되는게 아니라, 자식이 죽었을 경우 우선 좀비가 되는것으로 알고 있습니다.
즉, 좀비 상태라는 것이 자식이 죽었을때 부모가 자식의 종료 상태등을 얻기 위해 존재하게 됩니다. 이 경우 부모가 자식이 죽은후 바로 wait 등을 해서 종료 상태를 얻고 자식이 가진 자원등을 해제해주면 좀비 상태에서 벗어나 완전히 소멸되지만, 그렇지 않은 경우에는 계속 좀비 상태로 남아있게 됩니다.

Dream, Passion and Challenge..

댓글 달기

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