2010-01-14 3 views
11

Windows의 stdout과 관련된 데이터 제한에 대한 정보를 찾으려고합니다. MSDN에서 정보를 찾을 수없는 것 같습니다.stdout에 버퍼 크기가 첨부되어 있습니까?

  1. 표준 출력에 쓸 수있는 데이터의 양에는 제한이 있습니까? 그렇다면 한도에 도달하면 어떻게됩니까? 데이터가 손실 되었습니까?

  2. stdout이 리디렉션되는 경우 (예 : .Net에서 Process를 시작하고 ProcessStartInfo.RedirectStandardOutput 속성을 사용하여) 얼마나 많은 데이터를 쓸 수 있습니까? 호출 프로세스에서 stdout 스트림에서 읽었을 때 제한에 영향을 줍니까?

  3. 이러한 제한은 명명 된 파이프와 관련이 있습니까? 하지만 .NET에서 출력을 리디렉션하는 경우 출력을 읽을 수없는 경우 예, 당신은 쉽게 문제가 실행할 수 있습니다 -

답변

19

그것은 무슨 곳에 따라 달라집니다. 버퍼가 부족하면 자식 프로세스의 stdout에 대한 쓰기가 차단됩니다. 교착 상태의 한 가지 공통적 인 원인은 "자식"이 종료되고 출력을 읽는 것을 기다리는 "부모"프로세스입니다. 자식이 버퍼 공간을 확보하기 위해 출력을 읽기 위해 부모를 필요로하는 경우에는 작동하지 않습니다.

.NET은 Process.OutputDataReceivedProcess.ErrorDataReceived과 함께 이벤트 중심 접근 방식을 허용함으로써이 작업을 약간 더 쉽게 만들었습니다.

1) 존을 : 이것은 당신이 염두에두고 두 개의 스레드 (하나 개 읽어 표준 출력, 하나의 표준 오류를 읽을 수있는) 만 차단의 과정을 유지하는 ...

+1

게시 한 것보다 훨씬 도움이됩니다. 내 자신의 게시물 광고를 삭제하면됩니다. – David

+0

이제는 편리한 기능입니다. Java가 언젠가 그와 같은 것을 추가 할 것인지 궁금합니다. –

+0

(+1) .NET 의사 결정을 할 때 프로그래머가 단순화하는 것이 확실하기 때문에 훨씬 유용합니다. C++에서는 stdout이 기본적으로 매우 간단합니다. –

3

어떤 일을 시작할 필요가 없습니다 의미 맞습니다 - 버퍼 한도에 도달하면 하위 프로세스의 쓰기 호출이 차단됩니다. 파일처럼 자동으로 유출되도록 어딘가로 리디렉션되지 않으면 stdout 스트림을 배출해야합니다. 파이프가 고갈되어야하며 일반적으로 하위 프로세스 출력에 "부착"할 수 있으면 파이프에 연결됩니다.

2) 출력 스트림에 I/O는 서브 프로세스가 명시 적으로 거의 대부분의 경우 flush()를 호출하지 않고 stdout에 몇 가지 정보를 기록하는 경우, 당신은 출력을 볼 수 있음을 의미한다, 아마 버퍼입니다. 플러시는 프로세스가 종료 될 때 자동으로 호출되므로 짧은 작은 하위 프로세스 인 경우에는 확인해야하지만 그렇지 않은 경우 원하는 경우 출력을 강제로 표시 할 실제 방법이 없습니다.

3) 명명 된 파이프는 본질적으로 OS가 유지 관리하는 버퍼로, 쓰기 및 쓰기가 가능합니다. 즉, 실제로 하나의 프로세스에서 쓰고 다른 프로세스에서 읽을 수있는 파일과 같습니다. 디스크에 파일을 가지고있는 오버 헤드. 프로세스 간 통신에는 매우 편리하지만 버퍼링/전체 버퍼의 모든 I/O 제한 사항이 여전히 적용됩니다.

3

stdout에는 1024 바이트의 버퍼가 있습니다.

+2

이 소유권 주장의 출처가 있습니까? – Zero3

관련 문제