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개가 출력됩니다. 처음에는 이 불일치가 의아해 보입니다.
코드 실행 분석
이 동작을 이해하려면 실행 프로세스를 단계별로 분석해야 합니다.
버퍼링된 출력
문제의 핵심은 printf()의 버퍼링된 출력에 있습니다. 프로세스가 인쇄되면 출력이 즉시 화면에 표시되지 않습니다. 대신 버퍼에 저장됩니다. 이 동작은 fork() 시스템 호출이 버퍼를 복사하여 중복된 버퍼 도트를 생성하기 때문에 중요합니다.
총 8개의 도트
4개의 프로세스가 종료되면, 버퍼링된 도트는 플러시되어 처음에 인쇄된 단일 도트에 추가됩니다. 결과적으로 총 8개의 도트가 출력됩니다.
문제 방지
이 동작을 방지하려면 fflush(stdout)를 사용하여 출력 버퍼를 명시적으로 플러시할 수 있습니다. 각 printf() 호출. 이렇게 하면 출력이 즉시 화면에 전송되어 프로세스 수와 인쇄 도트 수 간의 불일치가 사라집니다.
위 내용은 이 코드에서 'fork()'가 6개가 아닌 8개의 점을 출력하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!