fork () 분기가 예상보다 많습니까?
다음 코드를 고려하십시오.
#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;
}
이 프로그램은 8 개의 점을 출력합니다. 어떻게 가능할까요? 대신 6 개의 점이 없어야합니까?
fork()
프리미티브는 종종 상상력을 뻗어. 느낄 때까지 각 작업이 무엇인지 종이에 기록하고 프로세스 수를 설명해야합니다. fork ()는 현재 프로세스의 거의 완벽한 사본을 생성한다는 것을 잊지 마십시오. (가장 큰 목적으로) 가장 큰 차이점은 fork()
의 반환 값이 부모와 자식간에 다르다는 것입니다. 이 코드는 반환 값을 무시하므로 차이가 없습니다.
처음에는 하나의 프로세스가 있습니다. 점과 루프를 인쇄하는 두 번째 프로세스를 만듭니다. 두 번째 반복에서 각각 다른 사본을 작성하므로 점을 인쇄 한 다음 종료하는 네 개의 프로세스가 있습니다. 따라서 예상대로 6 개의 점을 쉽게 설명 할 수 있습니다.
그러나 printf()
실제로하는 것은 출력을 버퍼링하는 것입니다. 따라서 두 개의 프로세스 만 있었을 때의 첫 번째 점은 쓰여질 때 나타나지 않습니다. 이러한 점은 버퍼에 남아 있으며 fork ()에서 복제됩니다. 버퍼링 된 점이 나타나는 프로세스가 종료 될 때까지는 아닙니다. 버퍼링 된 도트를 인쇄하는 네 가지 프로세스와 새로운 도트는 8 개의 도트를 제공합니다.
이 동작을 피하려면 fflush(stdout);
after로 전화하십시오 printf()
.
당신은이 출력 스트림에 커밋되지 않은 버퍼를 . stdout은 라인 버퍼링되며 버퍼는 나머지 프로세스와 함께 복제됩니다. 프로그램이 종료되면 커밋되지 않은 버퍼가 두 번 작성됩니다 (각 프로세스마다 한 번씩). 모두 사용
printf("a\n");
과
printf("a "); fflush(stdout);
문제를 나타내지 마십시오.
첫 번째 예에서는 출력 스트림 버퍼에 각각 두 개의 점이있는 네 개의 프로세스를 만듭니다. 각 스트림이 종료되면 버퍼를 플러시하여 8 개의 점을 생성합니다.
i = 0 일 때
Process_1 : 버퍼링 된 텍스트 = 1 점
Process_2 (Process_1에 의해 작성 됨) : 버퍼링 된 텍스트 = 1 점
i = 1 일 때
Process_3 (Process_1에 의해 생성됨) : Process_1에서 1 개의 버퍼 도트를 상속하고 자체적으로 1 도트를 인쇄합니다. 총 Process_3에서 2 개의 점을 인쇄합니다.
Process_4 (Process_2에 의해 작성 됨) : Process_2에서 1 개의 버퍼 된 점을 상속하고 자체적으로 1 개의 점을 인쇄합니다. 총 Process_4에서는 2 개의 점을 인쇄합니다.
Process_1 : 2 개의 점을 인쇄합니다 (i = 0이면 버퍼 된 점 하나, i = 1이면 다른 점)
Process_2 : 2 개의 점을 인쇄합니다 (i = 0이면 버퍼 된 점 하나, i = 1이면 다른 점)
최종 출력 : 8 도트. :)
참고 URL : https://stackoverflow.com/questions/11132868/fork-branches-more-than-expected
'Programming' 카테고리의 다른 글
$ .ajax ()에서 아약스 요청에 배열 전달 (0) | 2020.05.15 |
---|---|
APK는 이전 버전과 동일한 인증서로 서명되어야합니다. (0) | 2020.05.15 |
특정 ArrayList 항목 가져 오기 (0) | 2020.05.15 |
JavaScript에서 두 줄 이상의 코드에서 문자열을 나누려면 어떻게해야합니까? (0) | 2020.05.15 |
time_t는 궁극적으로 typedef 무엇입니까? (0) | 2020.05.15 |