2011-11-04 107 views
1

我有一个实时收集数据的过程,另一个过程正在绘制它。这两个过程通过管道连接,数据采集过程提供数据绘图过程。非阻塞管道中的I/O

我认为数据采集部分的速度超过了绘图部分的可靠性。快速skim显示管道中的默认行为是用于管道的写入和读取结束时显示阻塞行为,如果伙伴进程较慢。这很糟糕,因为数据采集过程可能会等待绘图过程。

有没有办法让shell管道是非阻塞的,la C的O_NONBLOCK?我不在乎如果一个数据点不会被绘制,因为它被一个新的点覆盖...

编辑:其实,我认为管道缓冲区足够大,足以容纳数据采集过程的输出,而不需要绘图部分需要立即处理。

回答

1

如果数据采集过程需要不受制图过程的限制而运行,则需要与连接两者的管道不同的结构 - 或者需要在中间有一个额外的过程,可以丢弃尚未存在的旧数据点发送给绘图仪。

概念:

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

在“容纳槽”可以是使用select()或在其输入和输出描述符类似的呼叫,和可容纳的数据点的有限数量。当一个新点从采集过程到达时,如果其储罐已满,它可以丢弃最老点并在其位置添加新点。如果绘图仪输入中有空间,它可以向绘图仪写入新的数据点。同时,收购过程可以平稳运行(只要储罐不会阻塞它),绘图仪也可以平稳运行。这三个过程全部通过管道连接。没有一个管道作为非阻塞操作运行。