fork에 프로세스가 너무 많이 생겨요

조회수 4358회

밑의 소스코드를 실행했을 때 제 의도대로라면 점이 6개 나와야 하는데 8개나 찍힙니다. 왜 그런가요?

소스코드

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main(void)
{
    int i;
    for(i = 0; i < 2; i++)
    {
        fork();
        printf(".");
    }
    return 0;
}

1 답변

  • 좋아요

    1

    싫어요
    채택 취소하기

    가끔 fork()가 생각보다 많이 되는 경우가 있습니다. 이럴 때에는 종이에 코드 흐름을 쓰면서 따라가 보세요

    처음에는 프로세스(1)가 하나만 있습니다. 프로세스1이 for문 안으로 들어와 fork()를 실행하면 두 번째 프로세스(2)가 만들어집니다. 이제 프로세 1과 프로세스2 모두 점을 출력합니다.

    프로세스1과 프로세스2가 for문을 두 번째로 돌 때(i=1일 때) fork()를 실행해 각각 프로세스3과 프로세스 4를 만듭니다. 이제 4개의 프로세스가 각각 한번씩 점을 찍습니다.

    그럼 총 점이 (2+4)번 찍혀야 합니다. 그런데 왜 점이 8개나 찍혔을까요?

    바로 printf()때문입니다. printf()는 output을 buffering합니다. 그러니까 첫 번째 loop에서(프로세스가 2개 있을 때) 사실 점은 출력되지 않고 버퍼에 남아있습니다.

    이 때, fork()가 현재 프로세스를 copy 할 때 버퍼 또한 copy되기 때문에 2번째 loop의 fork()가 프로세스3, 4를 만들 때 버퍼에 있는 내용도 복사됩니다. 그럼 4개 프로세스의 버퍼에 각각 점이 1개씩 들어있지요. 이제 printf()를 한번 더 실행하면 이제 4개의 프로세스의 버퍼에는 각각 점이 2개씩들어있고, 프로그램이 종료될 때, 프로세스들이 버퍼를 비우면서 총 8개의 점을 찍습니다.

    이걸 해결하려면 printf()뒤에 fflush(stdout)를 해주세요

    alt text

    • 오 좋은 답변이당 광자 2017.7.3 14:32

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)