>백엔드 개발 >C++ >이 코드에서 'fork()'가 6개가 아닌 8개의 점을 출력하는 이유는 무엇입니까?

이 코드에서 'fork()'가 6개가 아닌 8개의 점을 출력하는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-03 17:32:30295검색

Why Does `fork()` Output 8 Dots Instead of 6 in This Code?

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개가 출력됩니다. 처음에는 이 불일치가 의아해 보입니다.

코드 실행 분석

이 동작을 이해하려면 실행 프로세스를 단계별로 분석해야 합니다.

  1. 초기 상태: 실행 중인 단일 프로세스가 있습니다.
  2. 첫 번째 반복: 프로세스가 분기되어 별도의 메모리 공간이 있는 하위 프로세스가 생성됩니다. 부모와 자식 모두 점을 인쇄합니다.
  3. 두 번째 반복: 부모와 자식 모두 다시 포크하여 총 4개의 프로세스를 생성합니다. 각각은 점을 인쇄합니다.
  4. 프로세스 종료: 4개의 프로세스가 모두 종료되지만 이전 인쇄 작업에서 버퍼링된 점은 출력 버퍼에 남아 있습니다.

버퍼링된 출력

문제의 핵심은 printf()의 버퍼링된 출력에 있습니다. 프로세스가 인쇄되면 출력이 즉시 화면에 표시되지 않습니다. 대신 버퍼에 저장됩니다. 이 동작은 fork() 시스템 호출이 버퍼를 복사하여 중복된 버퍼 도트를 생성하기 때문에 중요합니다.

총 8개의 도트

4개의 프로세스가 종료되면, 버퍼링된 도트는 플러시되어 처음에 인쇄된 단일 도트에 추가됩니다. 결과적으로 총 8개의 도트가 출력됩니다.

문제 방지

이 동작을 방지하려면 fflush(stdout)를 사용하여 출력 버퍼를 명시적으로 플러시할 수 있습니다. 각 printf() 호출. 이렇게 하면 출력이 즉시 화면에 전송되어 프로세스 수와 인쇄 도트 수 간의 불일치가 사라집니다.

위 내용은 이 코드에서 'fork()'가 6개가 아닌 8개의 점을 출력하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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