管道中的非阻塞i / o

时间:2011-11-04 07:11:23

标签: io pipe nonblocking

我有一个实时收集数据的流程和另一个正在绘制它的流程。这两个过程通过管道连接,数据采集过程为数据绘制过程提供信息。

我更重视数据采集部分的速度而不是绘图部分的可靠性。快速skim表明,如果伙伴进程较慢,则管道中的默认行为是管道的写入和读取端显示阻塞行为。这很糟糕,因为数据采集过程可以等待绘图过程。

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

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

1 个答案:

答案 0 :(得分:1)

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

概念:

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

'储罐'可以在其输入和输出描述符上使用select()或类似的调用,并且可以保存有限数量的数据点。当一个新点从采集过程到达时,如果它的储罐已满,它可以丢弃最旧的点并在其位置添加新的点。如果绘图仪输入中有空格,则可以将新数据点写入绘图仪。同时,采集过程可以平稳运行(只要储罐永远不会堵塞),绘图仪也可以平稳运行。这三个过程都通过管道连接。没有管道作为非阻塞操作运行。