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