C语言中管道/命名管道的清空

3
我有两个进程在通信。第一个进程将数据写入管道或fifo(我尝试过两种方式),第二个进程读取其中的数据。目前发送的数据是六个浮点数,直接来自传感器,因此需要频繁上传(10Hz)。
问题在于读取数据的进程比较“沉重”,可能无法快速读取。管道会被填满,读取将被延迟到程序结束。
由于不能容忍这样的延迟,我可以在写入部分检测管道是否已满(在这种情况下,如果我理解得不对,请纠正我,它将等待有足够的空间来写入数据)。如果这种检测是可能的,那么我如何清除管道的内容,使读取部分可以立即接收到最新的数据,而不必经过整个充满旧数据的管道?
简而言之,是否有一种方法可以清空管道的数据(无需关闭和重新打开管道将是一个优点)。
非常感谢。

“清空管道”的常见方法是从中进行read()读取。 - mf_
是的,但需要多次调用 read() 才能获取最新数据,并且这会造成延迟(实际上就像我现在正在做的那样,使用 fgets())。 - wrousseau
你可以将文件(管道)映射到程序镜像中(启用需求分页),但我不知道这是否会帮助你加快速度。请确保刷新写入管道的写缓冲区。 - KrisSodroski
要么过滤write()放入管道中的内容,以便它不填充不必要的内容。 - mf_
1个回答

0

这将减少管道充满的频率,但不能完全消除。

范式转变:调整读取器以丢弃一定比例的读数。

写入者
当写入者看到一个满队列时,它会写入一个特殊数字(例如NaN),然后再写入所需的数字。

读取器
读取器被设置为丢弃P百分比的数字。

读取器读取一个数字-必要时等待。如果它不是要丢弃的候选数字,则按照通常方式继续。

当读取器考虑丢弃数字以满足其丢弃百分比时,首先测试管道是否为空。如果是,则读取器知道要减少被丢弃的百分比,并使用第一个读取的数字。如果管道不为空,则读取管道,丢弃第一个数字并使用第二个数字。

当读取器读取特殊数字时,它知道它没有丢弃足够的数字并增加其百分比,然后再次读取管道。

如果读写双方的整体性能差异不大,那么读取器会偶尔丢弃一个数字,以平衡快速写入器和缓慢读取器的性能。如果略微倾向于空队列而非满队列,则管道很少会填充,读取器更容易接收到新数字。


这看起来非常有趣,我会尝试实现它。 - wrousseau
期待结果的消息。 - chux - Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接