fork가 안되는 경우도 있나요?

kukuman의 이미지

이상한 것이...
max_process만큼 prefork를 하려고 하는데,,,
max_prcesss값이 10인데,,, 딱 3번 fork하고 안하는 건 왜 그럴까요-_-;;

process_num과 max_prcess값은 물론 확인을 했습니다...

fork 에러도 아닙니다...
에러 처리는 따로 해주었기 때문에 잡혀야 하는데,,,
안 잡힙니다...

2번 포크했다가 4번 했다가 그러는 것도 아니고 50번은 띄웠는데,,,
딱 3번만 포크합니다... -_-+

이런 경우도 있는지요??

errai의 이미지

fork()를 세번 call해서 4개의 process가 떠있는 상황인가요?
설명해주신 부분만 봐서는 무슨 문제인지 모르겠네요.
그 부분의 소스를 공개하시면 문제를 이해하는데 참고가 될 것 같습니다.

Necromancer의 이미지

fork()후에 부모노드인지 아닌지 체크 안하셨나요?

안할경우는 3번 fork()하면 3개가 아닌 8개의 프로세스가 생겨납니다.

이유를 말씀드리자면, fork()한 뒤에 부모인지 체크 안하고 바로 fork()하면
부모도 fork()하고 자식도 fork()하니까. 결국에는 프로세스수가 하나 늘어나는
게 아닌 두배로 늘어납니다.

Written By the Black Knight of Destruction

kukuman의 이미지

우선 답변들 감사드립니다~
제가 봐도 질문이 애매하네요 :oops:
근데 워낙에 황당해서... ^^

다음은 prefork하는 부분 code입니다...

unsigned int process_num = 0;

int main(int argc, char **argv)
{

    ...

start:
    pid = fork();
    process_num++;

    if ( pid == -1 ) {      /* Fork Error */
        syslog(LOG_INFO, "Fork Error - errno(%d): %s \n", errno, strerror(errno) );
        process_num--;
        exit(1);

    } else if ( pid == 0 ) {    /* Child Process */
        ChildProcess(s, Conf);
    }

    ...

    /* Loop for Parent Process */
    while (1)
    {

        /* Creatring Child Processes - Keeps the process numbers */
        if ( process_num < Conf->max_process ) goto start;

	...

        usleep(10);
    }   // while
 
}

보시다시피... 별로 특이한 것이 없습니다...
syslog를 찍어서 살펴본 바로는,,,
포크를 x개(오늘은 4개 하네요-_-, < max_process)하고는
parent process가 죽어버립니다... (ps로 보면 parent process의
PID가 없고, child process들의 PPID가 모두 1로 잡혀있습니다...)

Be at a right place at a right time...

hany93의 이미지

정확히 왜 3개만 fork 가 되는지는 잘 모르겠지만..

    } else if ( pid == 0 ) {    /* Child Process */ 
        ChildProcess(s, Conf); 
    } 

errai 님이 말씀하신것 처럼 ChildProcess.. 이놈이 처리하러 갔다가 복귀하면서 생기는 문제가 아닐까요?
다음줄에 exit(0) 하나 넣어서 혹여 복귀하더라도 그냥 종료하도록 하면 안될까요?

saxboy의 이미지

혹시 시그널처리들은 다 해주셨나요? wait도 그렇고...

prefork와 prethreading은 저도 몇번 시켜본 적이 있는데, 테이블을 따로 만들어두고 관리를 하시는 것이 더 편리할 것 같아 보입니다. 물론 지금은 실험이시겠지만...
stevens아저씨 책을 뒤져보시면 prefork와 prethreading에 대한 샘플들도 있으니 참조해보세요.

kukuman의 이미지

Quote:
정확히 왜 3개만 fork 가 되는지는 잘 모르겠지만..

코드:
} else if ( pid == 0 ) { /* Child Process */
ChildProcess(s, Conf);
}

errai 님이 말씀하신것 처럼 ChildProcess.. 이놈이 처리하러 갔다가 복귀하면서 생기는 문제가 아닐까요?
다음줄에 exit(0) 하나 넣어서 혹여 복귀하더라도 그냥 종료하도록 하면 안될까요?

else문을 넣어서 parent로 못가게 했는데도 여전하네요 -_-

Quote:
혹시 시그널처리들은 다 해주셨나요? wait도 그렇고...

네,,, signal handler를 둬서 처리하게 했습니다,,,
그리고 만약 chlild prcess가 죽을 경우 발생하는 SIGCHLD를 syslog로 찍게 해주었는데,,, 찍히지 않았습니다...
혹시 signal쪽으로 무엇이 잘못되면 이럴 수도 있는 건가요?

Quote:
prefork와 prethreading은 저도 몇번 시켜본 적이 있는데, 테이블을 따로 만들어두고 관리를 하시는 것이 더 편리할 것 같아 보입니다.

테이블을 따로 만들어 관리한다 함은 어떤 것을 말씀하시는지 조금 자세히 말씀해 주실 수 있을런지요?

Be at a right place at a right time...

jai의 이미지

지금 저도 fork() 하다가 죽어버려서요.
저는 대략 20번 정도 루프를 돌면서 fork -> execv() 를 합니다.
그런데 fork() 하다가 쓰레드가 죽는 경우가 생겨서요.

제 생각에는 비슷한 상황인것 같아서요.

참고로 저도 syslog() 를 사용해서 로깅하고 있는데,
로깅하는 부분에서 멈추는 경우도 발생했습니다.

** pstack 으로 살펴본 내용 **

0x155d3bb5: __sigsuspend + 0x21 (15adff7c, 20, 15adff7c, 818fa1c, 0, 0) + 90
0x155991d9: __pthread_wait_for_restart_signal + 0x59 (15ae0be0, 806f051, 15ae020c, 1559aeee, fbad8001, 15ae0116) + 50
0x1559af49: __pthread_alt_lock + 0x69 (156de470, 0, 19ae01cb, 15597cce, 15ae01cc, 15ae00cc) + 10
0x15597d26: __pthread_mutex_lock + 0x66 (156de460, 15597d90, 156de460, 1568f8ad, 15597d90, 156de460) + 10
0x1568f8fe: openlog + 0x5e (8073ab9, 48, b8, 0, 4453205b, 36323a44) + f0

sigsuspend 상태에서 깨어나지 않는 경우도 발생했습니다.

죄송하지만, 부디 해결하신 방법을 알려주시 겠어요?

peace :)

댓글 달기

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