拦截先进先出

Posted

技术标签:

【中文标题】拦截先进先出【英文标题】:Intercepting fifo 【发布时间】:2020-07-28 01:04:54 【问题描述】:

我有两个命名管道,用于应用和服务之间的通信。

基本上,该应用程序是一个 GUI,它接受用户的输入并将数据写入命名的 pip,我们称之为out_fifo。该服务读取该数据并执行一些其他操作,在完成处理后,它将结果写入命名管道,我们称之为in_fifo。此时App从in_fifo读取数据..

是否有可能从两个管道中截取/代理/读取写入的数据?我的意思是我可以在不中断应用程序和服务的情况下读取传递到两个管道的数据吗?

我尝试从服务中读取传入数据的内容:

#!/bin/bash    
in_data="in_fifo"
while :; do
    while true
    do
        if read -r line; then
            echo "Data: $line"
        fi
    done <"$in_data"
done

但是我从 shell 看不到任何东西,应用程序也没有继续运行。应用挂起等待数据

【问题讨论】:

【参考方案1】:

没有;就像它的名字应该显示的那样,FIFO 就是先进先出。如果不消耗流,就无法重新排序或读取内容。

可以做的是创建一个代理,它从一组 FIFO 读取并将相同的数据写回另一组,然后重新连接消费者以使用第二组而不是第一组。

【讨论】:

实际上我在问题中发布的脚本缺少一行(我删除了它),它在将行打印到屏幕后立即执行您提到的 echo "$line" &gt;&gt; out_fifo 的确切操作。但由于某些原因,应用程序挂起,我在终端中看不到任何输出。【参考方案2】:

strace 可以提供帮助。看这个帖子:https://***.com/a/46502533/13876104

编辑:您始终可以添加一组额外的 fifo 和一个应用程序来代理您的通信,但这意味着重新连接您的原始应用程序。但这是一种开销,如果您想要这样做的唯一原因是监控数据以进行调试,那么最好避免这种开销。

【讨论】:

谢谢,但strace 不是一个选项

以上是关于拦截先进先出的主要内容,如果未能解决你的问题,请参考以下文章

页面调度先进先出算法(FIFO) 用C语言描述 欢迎高手前来挑战

队列Queue FIFO先进先出 栈Stack FILO先进后出

队列 先进先出,先进后出,优先级队列

队列排序,先进先出

什么是先进先出的缓冲版本?

先进先出调度算法处理缺页中断