fork를 여러 차례 실행할 때 발생되는 문제인데요..
글쓴이: dltkddyd / 작성시간: 일, 2013/02/03 - 12:29오후
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
이라고 명령을 내리면 부모 자식 각각 하나씩만 출력되는데, 두 개 이상을 만들면 예상했던 것보다 많은 프로세스가 형성됩니다. 이유가 뭔지 궁금합니다.
Forums:
자식 프로세스가 다시 자식 프로세스를 만들어서 그런것
자식 프로세스가 다시 자식 프로세스를 만들어서 그런것 같습니다.
자식프로세스는 for 반복을 할때 fork를 호출하지 않도록하면 해결 될듯합니다.
부모를 기점으로 자식에서 자식으로 프로세스를 만들어야 하는군요.
말씀대로 하면 프로세스가 단선형으로 부모로부터 아래 자식으로 프로세스가 형성되는군요. 말씀대로 하지 않으면 프로세스가 이상한 트리구조가 되겠네요. 그런데 마지막 프로세스가 형성된 시점을 어떻게 알 수 있는지, 또 고민이 생깁니다. 또 팁좀 주시면 감사. 감사.
본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.
printf("Child pid
위의 놈을
으로 고쳐보세요.
댓글 달기