fork 를 했는데, main()이 다시 실행되는 경우도 있나요?

sia79의 이미지

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한 시점에서 분기를 시작해서 자식따로 부모따로 돌아가는 것이 아니었던가요?

디버거를 하고싶은데, 잘 못하겠네요. ㅜㅜ;; 포크 디버거도 어렵네요.

Necromancer의 이미지

보니까.

부모프로세스는 fork() 다음에 swich 내로 들어갔다가 나와서 for 문을 계속 돕니다. XX 변수에 지정된
갯수만큼 자식프로세스를 생성하고요. 끝나면 종료합니다.

자식프로세스는 work(i)로 들어가네요. work() 내를 추적해봐야 할 듯 합니다. 아님 work() 자리에
exit()를 넣어보시던지.

Written By the Black Knight of Destruction

Written By the Black Knight of Destruction

prether의 이미지

(아마도)
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.
***************************************/