2014-03-18 1 views
0

파이프 버퍼 사용량을보고하는 Linux 유틸리티가 있는지 궁금합니다.파이프 버퍼가 가득 찼다는 것을 알아내는 방법은 무엇입니까?

파이썬의 서브 프로세스 모듈을 사용할 때 OS 파이프 버퍼가 가득 차서 서브 프로세스가 차단되는 경우가 있습니다. 그런 일이 발생하면 일반적으로 추측을 통해 버퍼가 가득 찼다고 추론하는 데 상당한 시간을 소비합니다. 그래서, OS pipe 버퍼가 가득하다는 것을 발견하는 훨씬 쉬운 방법이 있다는 것을 알고 싶습니다.

감사

떠들썩한 파티에서
+1

정상적인 방법은 비 차단 I/O를 사용하는 것이지만이를 감지 할 수있는 이유는 무엇입니까? 파이프가 가득 차면 차단하도록 설계되었습니다. 그것이 가득 찼 으면 무엇을하고 싶니? – nos

+0

이 질문은 [Software Recommendations] (http://softwarerecs.stackexchange.com/) – Johnride

답변

1

정말 관심이 없어야합니다. 버퍼가 채워지더라도 작동하도록 프로그램을 설계해야합니다. 대부분의 합리적인 프로그램은 기다려야하며 판독기가 파이프에서 읽을 때 차단 해제됩니다.

즉 파이썬에서는 os.O_NONBLOCK을 사용할 수 있습니다. 을 쓸 때os.write을 차단하는 글씨는 EAGAIN으로 즉시 반환해야합니다. 리눅스 man 페이지에서 :

EAGAIN 파일 기술자 fd 소켓 이외의 파일을 참조하고 는 블로킹 (O_NONBLOCK)를 표시하고 있으며, 쓰기 것 블록.

하지만, 쓰기가 차단된다는 것을 알게되면 버퍼가 소모 될 때까지 기다리는 대신 수행해야 할 작업이 있습니까?

+0

에 속해 있다고 생각합니다. 감사합니다. @cnicutar. QEMU를 제어하기위한 몇 가지 스크립트를 만들려고했습니다. 이를 위해 QEMU 프로세스의 stdin/out을 하위 프로세스를 사용하여 파이프로 리디렉션했습니다. 그 당시 파이프를 배수하는 것을 잊어 버렸고 갑자기 QEMU 프로세스가 중단되었습니다. 프로세스가 파이프 라인이 가득 찼던 이유를 알아 내는데 몇 시간이 걸렸습니다. 따라서, 나는 그런 문제를 확인하는 빠른 방법이 있다는 것을 알고 싶었다. – Hani

0

, ulimit -p 당신을 알려줍니다.

$ ulimit -p 
8 

$ ulimit -a | grep pipe 
pipe size   (512 bytes, -p) 8 

여기서 파이프 버퍼의 크기는 512 바이트입니다. 그러나 당신은 명령에 의해 그것이 가득 차 있는지 없는지 알 수 없습니다.

관련 문제