2011-11-04 58 views
1

我有一個實時收集數據的過程,另一個過程正在繪製它。這兩個過程通過管道連接,數據採集過程提供數據繪圖過程。非阻塞管道中的I/O

我認爲數據採集部分的速度超過了繪圖部分的可靠性。快速skim顯示管道中的默認行爲是用於管道的寫入和讀取結束時顯示阻塞行爲,如果夥伴進程較慢。這很糟糕,因爲數據採集過程可能會等待繪圖過程。

有沒有辦法讓shell管道是非阻塞的,la C的O_NONBLOCK?我不在乎如果一個數據點不會被繪製,因爲它被一個新的點覆蓋...

編輯:其實,我認爲管道緩衝區足夠大,足以容納數據採集過程的輸出,而不需要繪圖部分需要立即處理。

回答

1

如果數據採集過程需要不受制圖過程的限制而運行,則需要與連接兩者的管道不同的結構 - 或者需要在中間有一個額外的過程,可以丟棄尚未存在的舊數據點發送給繪圖儀。

概念:

+-------------+ +------------+ +-------+ 
| Acquisition |--->|Holding Tank|--->|Plotter| 
+-------------+ +------------+ +-------+ 

在「容納槽」可以是使用select()或在其輸入和輸出描述符類似的呼叫,和可容納的數據點的有限數量。當一個新點從採集過程到達時,如果其儲罐已滿,它可以丟棄最老點並在其位置添加新點。如果繪圖儀輸入中有空間,它可以向繪圖儀寫入新的數據點。同時,收購過程可以平穩運行(只要儲罐不會阻塞它),繪圖儀也可以平穩運行。這三個過程全部通過管道連接。沒有一個管道作爲非阻塞操作運行。