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