>백엔드 개발 >C++ >간단한 fork() 루프가 2개가 아닌 8개의 점을 생성하는 이유는 무엇입니까?

간단한 fork() 루프가 2개가 아닌 8개의 점을 생성하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-04 02:04:02490검색

Why does the simple fork() loop produce eight dots instead of two?

fork()에서 예기치 않은 분기의 흥미로운 사례

fork() 기본 요소를 사용하여 하위 프로세스를 생성하는 다음 코드 조각을 고려하세요.

<code class="C">#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;
}</code>

놀랍게도 이 프로그램을 실행하면 처음 예상했던 것보다 6개가 더 많은 8개의 출력 도트가 생성됩니다. 왜 이런 일이 발생하는 걸까요?

숨겨진 프로세스 공개

이 미스터리를 풀기 위해, fork()의 동작을 파헤쳐 보겠습니다. fork()는 현재 프로세스의 복제본을 생성하여 상위 프로세스와 하위 프로세스를 만듭니다.

처음에는 두 개로 분기되는 단일 프로세스가 있습니다. 이 두 프로세스 모두 for 루프를 점진적으로 실행하여 매번 점을 인쇄합니다. 두 번째 반복에서는 각 프로세스가 다시 분기되어 총 4개의 프로세스가 생성됩니다. 이 네 가지 프로세스는 종료되기 전에 점을 인쇄합니다.

버퍼링된 출력 및 지연된 표시

그러나 printf()는 출력을 버퍼링합니다. 즉, 여러 개의 인쇄물을 보내기 전에 축적합니다. 즉시. 네 프로세스 모두 두 번째 점을 인쇄하면 버퍼링됩니다. 여기서 비열한 효과가 발생합니다.

fork() 시 버퍼링된 도트는 하위 프로세스에 상속됩니다. 따라서 각 하위 프로세스가 종료되면 해당 버퍼링된 점이 출력 스트림에 나타납니다. 점진적으로 인쇄되는 4개의 점에 이러한 4개의 지연된 점을 추가하면 예상치 못한 총 8개가 됩니다.

버퍼링된 점 방지

이 버퍼링된 동작을 우회하려면 다음을 호출하는 것이 좋습니다. fflush(stdout); 각 printf() 문 뒤에. 이렇게 하면 출력이 즉시 전송되어 예상되는 도트 수가 표시됩니다.

위 내용은 간단한 fork() 루프가 2개가 아닌 8개의 점을 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.