2010-08-01 3 views
2

나는 자식 프로세스의 출력을 읽기 위해 다양한 메소드 (popen, pipes + fork/exec ...)를 시도해 왔지만, 모두 작동하지만 같은 동작을 보인다. read/fread이면 버퍼가 완전히 차 있거나 자식이 종료 될 때만 반환됩니다. 나는 소켓과 비슷한 행동을 찾고 있는데, 가능한 한 빨리 모든 양의 데이터를 읽는다.일부 사용 가능한 즉시 하위 프로세스의 출력을 읽는 중입니까?

어떻게하면됩니까?

+0

다른 사람들이 말했듯이 자식 프로세스 버퍼를 플러시하도록 자식 프로세스를 변경해야합니다. 자식 프로세스가 표준 유닉스 유틸리티인가 아니면 소스에 대한 액세스 권한이 있습니까? – BillMan

답변

3

일반적으로 그렇지 않습니다. 특히 파이프에 연결된 스트림이 "대화 형"으로 표시되지 않으므로 하위 프로세스가 스트림을 버퍼링합니다. 자식 프로세스 내부에서 버퍼링이 일어나기 때문에 자식 프로세스에서 표준 출력을 버퍼링하지 못하도록 코드를 다시 작성하는 것이 유일한 방법입니다 (특정 스위치를 통과했거나 코드를 추가 할 수 있음). 파이프에 연결된시기를 감지하고 해당 특정 경우에만 버퍼링을 해제). 그러나 표준 출력에 많은 양을 쓴다면 (특히 버퍼링을 비활성화 할 때 선택적이지 않은 경우) 어린이의 성능에 영향을 미칠 수 있습니다.

+2

그리고 자식 프로그램을 수정할 수 없다면'script','expect', emacs 등과 같은 도구로 만든 pseudo-terminal에 연결하여 라인 버퍼링을 할 수 있습니다. – Gilles

+2

Gilles는 권리가 있습니다 여기 아이디어. 파이프 대신에 pty를 설정하면 호출 된 프로그램의'stdout'은 기본적으로 라인 버퍼 모드가됩니다. –

+1

@Gilles : .. 또는 pseudo-terminal pair를 직접 만들고 (posix_openpt()와 관련 함수를 사용하여) 자식을 연결할 수 있습니다. – caf

1

나는 그렇게 생각하지 않습니다. 버퍼링은 자식 측에서 처리되며 버퍼를 플러시하지 않으면 읽을 수있는 것이 없습니다. 그러나 몇 가지 도구에는 버퍼링을 제어하는 ​​명령 줄 옵션이 있습니다 (예 : grep --line-buffered.

관련 문제