동시에 여러개의 차일드를 kill하면 가끔 한두개가 defunct상태로 남는데요..

sisap의 이미지

안녕하세요?

페어런트 프로세스가 달랑 네개의 차일드만 있는데, kill 명령어로 차일드 pid 네개를 동시에 죽이면 가끔 한두개가 디펑트로 남고 죽질 안습니다..

그런 경우 ps -ef를 보면 대충 아래와 같은 식이고요..

32014 13553 00:00:18 ./dbcheck -c dbcheck.cfg
32017 32014 00:00:15 [db_child1 ]
32018 32014 00:00:17 [db_child4 ]
32334 32014 00:00:00 /usr/bin/perl /dbcheck/db_child3
32335 32014 00:00:00 /usr/bin/perl /dbcheck/db_child2

페어런트는 디비쿼리를 하는 네개의 차일드 프로세스를 갖고 있는건데..
하나씩 죽이면 몇번이고 잘 죽었다 다시 fork됩니다.. 그런데 한꺼번에 죽이려고 하면 가끔 위와 같이 한두개의 차일드가 디펑트가 나네요..

페이런트쪽 로그를 보면 디펑트난 차일드의 SIGCHID를 페어런트가 받지 못하는게 보이고요..

페어런트에서 시그널 처리는.. 아래와 같은 코드로...

/* Signal Handling - Death of a child */
struct sigaction sighand;

memset( &sighand, 0, sizeof( sighand ) );
sighand.sa_handler = pickup_child;
sighand.sa_flags = SA_NOCLDSTOP;
sigaction( SIGCHLD, &sighand, NULL );
sigaction( SIGPIPE, &sighand, NULL );

그리고 pickup_child 펑션에서

dead_child = wait( &status );

요렇게 기다리고 있다가 SIGCHLD를 받으면 그 차일드의 pid(dead_child)를 받아서 마무리좀 해주고 다시 포크를 해주는 건데요.. 디펑트나는 차일드 같은 경우는 이 페어런트에서 pickup_child 펑션 조차 콜이 안되는걸루 봐서 페어런트가 SIGCHLD를 못잡거나.. 아니면 차일드가 디펑트가 나기때문에 SIGCHLD를 아예 발생을 안시키는 그런경우 같은데...

왜 하나씩 죽이면 괜찮고 한꺼번에 죽일때만 이런 현상이 벌어지는건지... 혹시 이런 경험 해보신분... 아님 어떤 조언이라도 달게 받겠습니다 -_-;;

그럼.. 전문가분들의 섬세한 손길을 부탁드리며.. 후우~...
즐코딩 하세요.. -_-;;

prether의 이미지

wait(&status)함수는 하나의 child zombie만 릴리즈합니다.

여러개의 child process가 죽으면서 각자 SIGCHLD를 발생해도
부모 프로세스의 SIGCHLD처리가 pending 혹은 블록킹된 경우라면
뒤늦게 도착한 넘들은 무시됩니다.
즉 4개의 SIGCHLD가 발생해도 부모 입장에서는 최악의 경우
시그널 처리를 한번만 할수도 있습니다.

아까 말했듯이 wait(&status)함수는 하나의 child zombie만 릴리즈하기
때문에 나머지 자식들은 계속 상태로 남게 되는거죠.
이를 막기 위해 SIGCHLD핸들러 함수에 아래와 같은 코드조각을 넣어야 합니다.

while((pid = waitpid(-1, &status, WNOHANG)) >0) {
//bla bla...
}

특정 PID가 아닌 any PID의 자식 좀비를 릴리즈하죠. 중요한건
옵션으로 WNOHANG이 필요하다는 겁니다. 그게 없으면 행이 될수도 있습니다.

릴리즈에 성공하면 해당 PID를 리턴하고 릴리즈 할게 없다면 양수외의 값을
논-블록으로 리턴하게 됩니다.

/***************************************
Being the one is just like being in love.
***************************************/

댓글 달기

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