我正在读书关于 rpi 的这个问题并注意到一句有趣的台词让我思考:
mkfifo tcp.stream
nc -l -p 1234 > tcp.stream | omxplayer --live tcp.stream
注意 io 重定向。 STDOUT 被重定向两次!我担心的是 omxplayer 没有与任何可用的 STDIN 关联可能有点难以控制,但我认为这确实具有在 omxplayer 退出时用 SIGPIPE 杀死 nc 的优点。这是一个好主意吗?在某些奇怪的情况下值得推荐吗?
答案1
nc
管道的一端将立即关闭。当omxplayer
芯片nc
在写入 fifo(而非管道)时收到 SIGPIPE。
最好只nc
在后台运行,以便您可以omxplayer
通过标准输入保持控制。
mkfifo tcp.stream
nc -l -p 1234 > tcp.stream &
omxplayer --live tcp.stream
然而,从 shell 的作业控制的角度来看,使用代替实际上是有意义的|
。&
使用|
:
$ mkfifo fifo
$ nc -l -p 1234 >fifo | cat fifo
nc
并且cat
属于同一进程组(PGID 9177)。
$ ps f -o pid,ppid,pgid,command
PID PPID PGID COMMAND
9095 1681 9095 bash
9179 9095 9179 \_ ps f -o pid,ppid,pgid,command
1691 1681 1691 bash
9177 1691 9177 \_ nc -l -p 1234
9178 1691 9177 \_ cat fifo
Ctrl当用户输入+时,它们都会收到 SIGINT 然后退出C。
使用&
:
$ mkfifo fifo
$ nc -l -p 1234 >fifo & cat fifo
[1] 9183
nc
并且cat
属于不同的进程组(PGID 9183 和 9184)。
$ ps f -o pid,ppid,pgid,command
PID PPID PGID COMMAND
9095 1681 9095 bash
9185 9095 9185 \_ ps f -o pid,ppid,pgid,command
1691 1681 1691 bash
9183 1691 9183 \_ nc -l -p 1234
9184 1691 9184 \_ cat fifo
cat
在这种情况下,当用户键入Ctrl+时,只有前台进程 ( ) 接收到 SIGINT C。如果nc
尚未连接,它将继续在后台运行。
^C
$ jobs
[1]+ Running nc -l -p 1234 > fifo &
$ kill %
[1]+ Terminated nc -l -p 1234 > fifo