"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 간단한 fork() 루프가 2개가 아닌 8개의 점을 생성하는 이유는 무엇입니까?

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

2024년 11월 12일에 게시됨
검색:617

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

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

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

#include 
#include 
#include 

int main(void)
{
    int i;
    for(i = 0; i 

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

숨겨진 프로세스 공개

이 미스터리를 풀기 위해 fork()의 작업을 자세히 살펴보겠습니다. fork()는 현재 프로세스의 복제본을 생성하여 상위 프로세스와 하위 프로세스를 생성합니다.

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

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

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

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

버퍼링된 점 방지

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

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3