아니요, POSIX 동작이 아니며 ISO 동작 입니다. 만하는 한 그들은 ISO에 부합로 POSIX 동작).
표준 출력은 대화식 장치를 나타내는 것으로 감지 될 수있는 경우 라인 버퍼링됩니다. 그렇지 않으면 완전히 버퍼링됩니다. 따라서 다음 printf
과 같이 줄 바꿈을 보내더라도 플러시되지 않는 상황이 있습니다 .
myprog >myfile.txt
사용자와 상호 작용하는 경우 모든 행을보고 싶을 수 있으므로 효율성에 적합합니다. 출력을 파일로 보내는 경우 다른 쪽 끝에 사용자가 없을 가능성이 높습니다 (불가능하지는 않지만 파일을 테일링 할 수 있음). 이제 당신 은 할 수 있습니다 사용자가 모든 캐릭터를보고 싶어하지만 두 가지 문제 있다고 주장 있습니다.
첫 번째는 매우 효율적이지 않다는 것입니다. 두 번째는 원래의 ANSI C 명령이 새로운 행동을 발명하기보다는 기존의 행동 을 주로 체계화 하는 것이며, 그러한 설계 결정은 ANSI가 프로세스를 시작하기 훨씬 전에 이루어 졌다는 것입니다. 오늘날의 ISO조차도 표준의 기존 규칙을 변경할 때 매우 신중하게 밟습니다.
그걸 다루는 방법에 관해서는 fflush (stdout)
즉시보고 싶은 모든 출력 호출 후에 문제를 해결할 것입니다.
또는에서 setvbuf
작동하기 전에 stdout
버퍼링되지 않도록 설정하고 fflush
코드에 모든 행을 추가하는 것에 대해 걱정할 필요가 없습니다 .
setvbuf (stdout, NULL, _IONBF, BUFSIZ);
출력을 파일 로 보내는 경우 성능에 상당한 영향을 줄 수 있음을 명심 하십시오. 또한 이것에 대한 지원은 표준에 의해 보장되지 않고 구현에 의해 정의된다는 것을 명심하십시오.
ISO C99 섹션 7.19.3/3
은 관련 비트입니다.
스트림이 버퍼링되지 않은 경우 가능한 빨리 소스 또는 대상에서 문자가 표시됩니다. 그렇지 않으면 문자가 블록으로 호스트 환경에 쌓이거나 전송 될 수 있습니다.
스트림이 완전히 버퍼링 되면, 버퍼가 채워질 때 문자가 호스트 환경으로 또는 블록에서 호스트로 전송됩니다.
스트림이 라인 버퍼링 되는 경우, 개행 문자가 발생할 때 문자가 호스트 환경과 블록으로 전송되도록 의도됩니다.
또한 문자는 버퍼가 채워질 때, 버퍼되지 않은 스트림에서 입력이 요청 될 때 또는 호스트 환경에서 문자를 전송해야하는 라인 버퍼링 된 스트림에서 입력이 요청 될 때 호스트 환경에 블록으로 전송됩니다. .
이러한 특성에 대한 지원은 구현에 따라 정의되며 setbuf
및 setvbuf
기능 을 통해 영향을받을 수 있습니다 .