2010-06-24 3 views
1

제 질문은 유닉스가 아닌 Windows에 관한 것이지만 "Turn off buffering in pipe"과 관련이 있습니다.Win32에서 콘솔 출력을 필터링 할 때 원하지 않는 버퍼링이 발생했습니다.

나는 복제본을 작성하고 각자 다른 사람의 콘솔 출력을 스래 싱하지 못하도록 병렬 처리를 중지하고 있습니다. 출력을 원하는대로 필터링 할 수있는 파이프 (here에 설명 된대로)로 리디렉션했습니다. 불행히도 오래 실행되는 프로세스는 이제 콘솔 에서처럼 실시간으로 보내지 않고 출력을 버퍼링합니다.

MSVCRT 소스를 들여다 보면 GetFileType()이 표준 I/O 핸들이 콘솔에 연결되어 있는지 여부를 확인하는 데 사용됩니다. 그러면 콘솔이 내부 플래그를 설정하고 버퍼링을 해제합니다.

상속 가능한 파일 핸들과 플래그의 별도 배열은 프로세스 생성시 STARTUPINFO 구조화되지 않은 lpReserved2 멤버를 통해 전달 될 수 있습니다. 알아 낸 유일한 해결책은이 목록을 사용하고 stdout/stderr 플래그를 설정할 때 장치 유형에 관한 것입니다.

이제 ... 정상인이이 문제를 해결하는 방법은입니까?

답변

1

없습니다. 예, GetFileType()은 stdout이 더 이상 char 장치가 아니며 _isatty()가 false를 반환하면 CRT가 출력 스트림을 버퍼 모드로 전환합니다. 합리적인 처리량을 얻는 것이 중요합니다. 한 번에 한 문자 씩 출력을 플러시하는 것은 사람이보고있을 때만 허용됩니다.

사용자 지정 CRT 버전으로 리디렉션하려고하는 프로그램을 다시 연결해야합니다. 나는 그것이 가능하다면, 당신은 처음부터 이것을 망칠 생각이 없다는 것을 의심하지 않습니다. 패치 GetFileType()은 다른 일반적인 솔루션입니다.

+0

이것은 성능을 향상시킬뿐만 아니라 표준을 준수하기 위해 수행되었습니다. C99, §7.19.3/7 : "표준 입력과 표준 출력 스트림은 스트림이 대화 형 장치를 참조하지 않을 것으로 판단 될 수있는 경우에만 완전히 버퍼링됩니다." –

관련 문제