保持管道打开而不读取它?

时间:2012-09-15 11:47:46

标签: linux bash pipe vlc

我正在使用vlc媒体播放器通过互联网连接到rtsp流。

我只需要定期查看流,但每次建立连接都需要很长时间。

相反,我保持连接打开,vlc将输出作为传输流写入命名管道。

然后,当我需要时,vlc的第二个实例可以从管道中读取。

问题是,据我所知,除非打开阅读,否则无法写入命名管道。

当第二个vlc实例未打开时解决此问题我:

    cat < $PIPE > /dev/null

除了以这种方式使用cat之外,还有更好的方法来保持管道开放以便写入吗?

1 个答案:

答案 0 :(得分:0)

如果管道还没有准备好写入,你没有说出连接VLC的作用。

如果它在看到管道未准备好写入并且继续从连接读取时丢弃输出,那么您可以简单地创建一个打开管道但不读取它的进程。像这样:

while sleep 7d; do :; done < $PIPE &

然后,当你开始播放VLC时,它将从管道开始读取,连接的VLC将写入它,直到播放的VLC停止。

但是,如果连接VLC在写入管道时停止,则通过上述设置,RTSP连接最终会超时,当播放VLC开始从管道读取时,连接VLC将终止或需要重新连接。 VLC也可能只是在写入管道时超时。

在这种情况下,您可以从管道中读取并丢弃其内容,直到播放VLC到达,并在停止时继续读取。您可以让多个进程打开一个管道,但数据只能从中读取一次,即进程将竞争数据。

你可以通过在开始播放VLC之前暂停使用SIGSTOP的丢弃过程并在停止后使用SIGCONT恢复它,假设读取管道的间隙不足以使连接超时。

像这样:

cat $FIFO > /dev/null &
kill -SIGSTOP %
vlc $FIFO
kill -SIGCONT %