fork 를 했는데, main()이 다시 실행되는 경우도 있나요?
글쓴이: sia79 / 작성시간: 수, 2007/04/18 - 8:27오후
int main() { printf("### main() ###\n"); for( i = 0; i < XX; ++i){ switch( fork() ) { case -1: error; return -1; case 0: while(1) { work(i); } default: break; } } return 0; }
프로그램을 간추리면 저런 형식으로 짜여서 X개의 자식이 각각에 맞는 work를 합니다.
그런데, 문제는 fork로 생성된 자식이 메인함수 자체를 다시 호출한 것같습니다. (로그에 남은 것을 보면.)
printf("### main() ###\n"); 문이 다시 찍혀 나온 것이 도저히 이해가 안됩니다. ( 한번 이상;;;)
fork는 fork한 시점에서 분기를 시작해서 자식따로 부모따로 돌아가는 것이 아니었던가요?
디버거를 하고싶은데, 잘 못하겠네요. ㅜㅜ;; 포크 디버거도 어렵네요.
Forums:
보니까.부모프로세스
보니까.
부모프로세스는 fork() 다음에 swich 내로 들어갔다가 나와서 for 문을 계속 돕니다. XX 변수에 지정된
갯수만큼 자식프로세스를 생성하고요. 끝나면 종료합니다.
자식프로세스는 work(i)로 들어가네요. work() 내를 추적해봐야 할 듯 합니다. 아님 work() 자리에
exit()를 넣어보시던지.
Written By the Black Knight of Destruction
Written By the Black Knight of Destruction
printf()가 쓴 내용이 flush가 아직 안되어서
(아마도)
printf()로 쓴 내용이 아직 flush가 안되고
buffer에 머문 상태에서
fork를 하면 부모 뿐 아니라 자식의 buffer에도
(부모 것을 그대로 자식에게 복사하므로)
프린트할 내용을 남아있게 되죠.
일정 시간 후 flush가 이루어질 때 부모의 버퍼 뿐 아니라
자식의 버퍼 내용도 flush되어 여러 개가 찍히는 걸로 보입니다.
그 현상이 안보이게 하기 위해
printf()후 fflush()를 호출시켜 강제로 flush해보세요.
하나만 찍히는 걸로 보이게 될겁니다.
/***************************************
Being the one is just like being in love.
***************************************/
/***************************************
Being the one is just like being in love.
***************************************/
댓글 달기