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


밑의 소스코드를 실행했을 때 제 의도대로라면 점이 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;
}
  • 2016년 06월 01일에 수정됨
  • 2016년 01월 24일에 작성됨

조회수 317


1 답변


좋아요
0
싫어요
채택취소하기

가끔 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

  • 2016년 01월 24일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close