2014-03-18 31 views
0

我想知道是否有一個Linux實用程序來報告管道緩衝區的使用與否。如何找出管道緩衝區已滿?

當我使用python的子進程模塊時,有時會因爲OS管道緩衝區已滿而導致子進程被阻塞。當它發生時,我通常會花費大量的時間來推測緩衝區已滿。所以,我想知道有更簡單的方法找出OS管道緩衝區已滿。

感謝

+1

雖然正常的方法是使用非阻塞I/O,它允許您檢測它,爲什麼這對您來說是一個問題?管道被設計成當它們滿時阻塞。當它滿了時你想做什麼? – nos

+0

我覺得這個問題屬於[Software Recommendations](http://softwarerecs.stackexchange.com/) – Johnride

回答

1

你不應該對此感興趣。您應該設計程序,使其即使在緩衝區填滿時也能正常工作:大多數合理的程序應該等待,並在讀取器從管道讀取時解除阻塞。

這就是說,在python中你可以使用os.O_NONBLOCK。當你做寫一個會阻止os.write應該立即返回EAGAIN。從Linux手冊頁:

EAGAIN文件描述符fd是指除插座之外的其他文件和 已被標記爲非阻塞(O_NONBLOCK),並寫入會 塊。

但是像nos問,一旦你知道寫入會阻塞,還有什麼可以做,而不是隻是等待緩衝區耗盡?

+0

謝謝@cnicutar。我試圖製作一些腳本來控制QEMU。爲此,我使用子進程將stdin/QEMU進程重定向到管道。當時,我忘記排幹管道,突然QEMU進程停止。花了幾個小時才發現過程停止的原因是管道已滿。因此,我只是想知道有一些快速的方法來識別這樣的問題。 – Hani

0

在bash,ulimit -p告訴你。

$ ulimit -p 
8 

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

這裏管道緩衝區的大小是512字節。但是你無法知道它是否完整與否。