使用管道在后台运行命令

使用管道在后台运行命令

我正在读书关于 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

相关内容