programing

fork() 브랜치가 예상보다 많습니까?

minecode 2022. 7. 11. 21:40
반응형

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()의 반환값은 부모 및 자녀에 따라 다릅니다.(이 코드는 반환값을 무시하므로 차이가 없습니다.)

그래서 처음에는 한 가지 과정이 있습니다.그러면 두 번째 프로세스가 생성되고 두 번째 프로세스는 모두 점과 루프를 인쇄합니다.두 번째 반복 시 각각 다른 복사본이 생성되므로 4개의 프로세스가 점을 인쇄한 후 종료합니다.예상대로 6개의 점을 쉽게 설명할 수 있습니다.

하지만, 뭐?printf()실제로는 출력을 버퍼링합니다.따라서 2개의 프로세스만 있었을 때의 첫 번째 점은 작성 시 표시되지 않습니다.이러한 도트는 버퍼에 남습니다.이것은 fork()로 복제됩니다.프로세스가 종료될 때까지 버퍼링된 점이 표시되지 않습니다.버퍼링된 도트를 인쇄하는 4가지 프로세스와 새로운 도트를 더하면 8개의 도트를 얻을 수 있습니다.

이 동작을 피하고 싶다면fflush(stdout);끝나고printf().

출력 스트림에 커밋되지 않은 버퍼가 있습니다.stdout은 회선으로 제어되며 버퍼는 나머지 프로세스와 함께 복제됩니다.프로그램이 종료되면 커밋되지 않은 버퍼가 2회(프로세스별로 1회) 작성됩니다.둘 다 사용

printf("a\n");

그리고.

printf("a "); fflush(stdout);

문제를 드러내지 마세요.

첫 번째 예에서는 출력 스트림버퍼에 각각2개의 점이 있는4개의 프로세스를 만듭니다.각 스트림은 종료되면 버퍼를 플러시하여 8개의 도트를 생성합니다.

i=0인 경우

프로세스_1: 버퍼링된 텍스트= 1 도트

Process_2(Process_1에 의해 작성):버퍼링된 텍스트 = 도트 1개

i=1일 때

Process_3(Process_1에 의해 작성):Process_1에서 버퍼링된 도트 1개를 상속하고 도트 1개를 인쇄합니다.전체 프로세스_3은 2개의 점을 인쇄합니다.

Process_4(Process_2에 의해 작성):Process_2에서 버퍼링된 도트 1개를 상속하고 도트 1개를 인쇄합니다.전체 프로세스_4는 2개의 점을 인쇄합니다.

프로세스_1 : 2개의 도트를 인쇄합니다(i=0일 때 버퍼링된 도트 1개와 i=1일 때 다른 도트 1개).

프로세스_2 : 2개의 도트를 인쇄합니다(i=0일 때 버퍼링된 도트 하나, i=1일 때 다른 도트 하나).

최종 출력: 8 도트.:)

언급URL : https://stackoverflow.com/questions/11132868/fork-branches-more-than-expected

반응형