fork에 프로세스가 너무 많이 생겨요
조회수 4368회
밑의 소스코드를 실행했을 때 제 의도대로라면 점이 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 답변
-
가끔 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)
를 해주세요
댓글 입력