fork를 여러 차례 실행할 때 발생되는 문제인데요..

dltkddyd의 이미지

fork 함수로 흐름을 부모 자식으로 두 개 만든다고 알고 있습니다. 모듈의 fork를 호출하면 자식프로세스에는 0을, 부모프로세스에는 부모에 의해 생성된 자식프로세스의 pid가 반환됩니다. 제가 실험적으로 fork 함수를 다음과 같은 코드를 만들어서 두 번 실행해봤습니다.

#include <unistd.h>
#include <cstdlib>
#include <cstdio>
int main(int argc, char** argv) {
  unsigned int process_num;
  process_num=stounum(argv[1]);//이 함수는 숫자문자열을 unsigned int로 반환합니다.
  pid_t pid;
  int count=0;
  for(int i=0;i<process_num;i++) {
    switch(pid=fork()) {
      case -1:
        perror("Error message ");
        exit(EXIT_FAILURE);
        break;
      case 0:
        break;
      default:
        count++;//분기가 몇 번 만들어졌는지 카운트한다.
        //sprintf(buf,"parent pid %u childpid %u",getpid(),pid);
        printf("%d\n",count);//test
        printf("Parent pid %d\n",getpid());//test
        printf("Child pid %d\n",pid);//test
        break;
    }
  }
  return 0;
}

위와 같은 코드의 fp.cc 파일을 컴파일하고 다음과 같이 fork 함수가 두 번 호출되도록 해봤습니다.

./fp 2

그런데 이상하게도 결과는 다음과 같습니다.

1
Parent pid 5854
Child pid 5855
1
Parent pid 5855
Child pid 5856
2
Parent pid 5854
Child pid 5857

분기가 두 개가 아니라 세 개로 만들어졌습니다. 그래서 형성된 자식프로세스도 세 개로 출력되고요. 제가 기대했던 것은 부모와 자식프로세스가 각각 두 개만 출력되는 것이었습니다. 두 개여야 되는 것 아닌지요?

./fp 1

이라고 명령을 내리면 부모 자식 각각 하나씩만 출력되는데, 두 개 이상을 만들면 예상했던 것보다 많은 프로세스가 형성됩니다. 이유가 뭔지 궁금합니다.

Anti-Lock의 이미지

자식 프로세스가 다시 자식 프로세스를 만들어서 그런것 같습니다.
자식프로세스는 for 반복을 할때 fork를 호출하지 않도록하면 해결 될듯합니다.

dltkddyd의 이미지

말씀대로 하면 프로세스가 단선형으로 부모로부터 아래 자식으로 프로세스가 형성되는군요. 말씀대로 하지 않으면 프로세스가 이상한 트리구조가 되겠네요. 그런데 마지막 프로세스가 형성된 시점을 어떻게 알 수 있는지, 또 고민이 생깁니다. 또 팁좀 주시면 감사. 감사.

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

익명 사용자의 이미지

printf("Child pid %d\n",pid);//test
break;

위의 놈을

printf("Child pid %d\n",pid);//test
return 0;

으로 고쳐보세요.

댓글 달기

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