2010-10-02 4 views
8

이 질문은 전에 한 번 이상 물어 본 질문이지만 만족스런 답변을 찾지 못했습니다.Process.StandardOutput에서 출력 버퍼링을 사용하지 않도록 설정하는 방법

나는 대략 매초마다 새로운 결과를 산출하는 STDOUT에 순간 측정을 생성하는 명령 행 과정을 시작하고있다. System.Diagnostics.Process.StandardOutput을 사용하면 STDOUT 데이터가 Process.StandardOutput StreamReader의 4k 버퍼를 통해 작동하기 때문에 완전히 받아 들일 수없는 지연 (20 초 이상)이 발생합니다.이 문제를 해결할 방법이없는 것 같습니다.

Calling Process.StandardOutput.BaseStream.Flush()가 작동하지 않습니다.

Process.StandardOutput에 대해 바이트 단위로 동기 읽기를 시도했지만 실제 출력보다 4k가 남았습니다.

적어도 나를 확인하면 STDOUT을 리디렉션하는 것과 관련된 모든 버퍼링 문제를 극복 할 수 있으며 쉘 창에 나타나 자마자 응용 프로그램에서 데이터를받을 수 있습니까? Process 클래스에서 상속 받고 StandardOutput 스트림 판독기가 작동하는 방식을 변경할 수 있습니까? 원시 WINAPI 호출을 조사해야합니까?

아무튼,이 작업을 수행해야합니다. 결국 관리되지 않는 C++로 작업을 시작하고 결과물을 소비하고 링크하는 경우에도 마찬가지입니다. 도움이 될만한 점이 많습니다. 나는 지혜 끝에 ...

편집 : 내가 필요로하는 것은 C/C++, Perl, Python 및 Java에서 사용할 수있는 "expect"라이브러리의 .Net 구현입니다. 내가 지금까지 발견 한 유일한 것들). 그런 짐승이 있는지 누가 알겠습니까?

+0

이 질문에 대한 좋은 답변을 얻지 못했습니다 ... –

+0

예. 나는 외부 명령에 대한 소스 코드를 얻고, 명시적인 STDOUT 버퍼 플러시로 다시 컴파일했다. 그래도 여전히 원래의 문제를 해결하고 싶습니다. 나는 .Net Expect 구현을 직접 작성했지만, 외부 도구를 다시 컴파일하는 것은 내 상사가 내게 소리 지르는 것을 피하는 더 좋은 방법 인 것처럼 보였다. –

+0

나는 같은 문제로 어려움을 겪고있다. 별도의 스레드 (또는 stderr 실제로 2 : 1, stdout 1) 콘솔 출력을 읽고 있어요. 결과적으로 StandardOutput은 'Peek'와 같은 호출을 사용할 때만 버퍼링을합니다.이 프로세스에서는 -1을 반환합니다. 단순히 1 바이트로'ReadLine'이나'Read'를 사용하면, 잘 작동 할 것이고 버퍼링에 문제가 없을 것입니다. – atlaste

답변

1

"리디렉션되는 것을 깨닫지 못하는 등의 문제가 발생합니다." 예, 정확히 Expect의 도메인입니다. 나는 .Net 구현을 안다; 그래도 확실하게 실현 가능합니다 ...

+0

Windows가 내부적으로 작동하는 방식 때문에 매우 힘듭니다! (실제 가상 터미널에 액세스 할 수있는 Unix의 Mono는 아니지만 다른 이야기입니다.) Windows는 일종의 펑키 디버깅 모드를 사용하여 모든 작업을 수행하며 AIUI는 정말 해킹입니다. 서브 프로세스에서 실제'expect' 자체 ('unbuffer' 스크립트 실행)를 사용하는 것이 더 쉬울 것입니다; 네, 전개가 더 힘들지 만 실제로 작업 할 수있는 좋은 기회가 있습니다. 'telnet '을 제외하고.exe'; 그것은 특별한 (그리고 초조 한) 케이스입니다. –

관련 문제