> 백엔드 개발 > C++ > 본문

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

Susan Sarandon
풀어 주다: 2024-11-04 02:04:02
원래의
432명이 탐색했습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!