Cat 到命名管道导致挂起

Cat 到命名管道导致挂起

我正在尝试使用 FFMpeg 进行一些流式传输,我想我终于找到了解决屏幕消隐问题的方法。这需要将 PNG 写入命名管道,然后让 FFMpeg 将它们读取为覆盖层。但是,我似乎遇到了一个奇怪的问题。

#!/bin/bash

mkfifo /tmp/stream_pipe
cat /path/to/transparent/or/splash/screen.png > stream_pipe
echo "done!"

在这个例子中,echo "done!"实际上从未运行。

因此,我转到终端并尝试了同样的事情,果然命令cat无限期挂起。

我不记得曾经遇到过将 catting 到命名管道的问题,事实上,我看到很多命名管道引用都只使用这个。这里可能出了什么问题?cat一旦将文件写入管道,它不应该退出吗?正在写入的文件只是一个普通的 PNG 文件,所以这真的让我很困惑。

或者是cat在写入时尝试关闭管道?这可以解释为什么它会挂起,因为它不是一个合法的文件,但我想它cat会知道区别或不会在意。

编辑:cat $file | echo -n > /tmp/stream_pipe表现出相同的行为

答案1

您需要从 FIFO 读取一些内容。

尝试这个:

#!/bin/bash 

mkfifo /tmp/stream_pipe
cat /path/to/transparent/or/splash/screen.png > stream_pipe &
cat stream_pipe
echo "done!"

您应该将文件的内容打印到屏幕上(与您执行的操作相同cat /path/to/transparent/or/splash/screen.png)。

答案2

cat $file >/tmp/stream_pipe没有工作,但我能够通过将管道分配给文件描述符使其工作(在某种程度上),如下所示:

#!/bin/bash

exec 3<>/tmp/stream_pipe
cat /path/to/file.png >&3

我说它在某种程度上有效,因为单独运行它会堵塞管道,并且脚本似乎挂起了。这是因为 Ubuntu 中的管道有 1M 的缓冲区限制,如通过命令所见systcl fs.pipe-max-size。不幸的是,通过设置此值sysctl似乎不会改变它。但是,只要管道数据被另一个进程使用,就不会出现问题。对完整管道的任何写入都会被阻止(看起来像是挂起了,但事实并非如此),直到数据被使用,此时写入将继续。

相关内容