这四个命令有什么区别(fifo、进程替换、重定向...)

这四个命令有什么区别(fifo、进程替换、重定向...)

我的目标是使用nc单个fifo.我并不是在寻找最好的方法,我只是想理解以下命令的语义(分叉何时发生,为什么,它会改变什么,为什么命令的行为不同......)。

我使用的是 Bash,所以我不确定是否所有命令都适用于 POSIXshzsh, ksh, ...

这是我在标题中提到的四个命令(假设我已经这样做了mkfifo fifo):

cat fifo | nc -l localhost 8888 > fifo
exec 3<> fifo && nc -l localhost 8888 <&3 >&3 && exec 3>&-
nc -l localhost 8888 <(cat fifo) > fifo
nc -l localhost 8888 < fifo > fifo

现在我希望这 4 个命令能做同样的事情,至少最后两个命令能做同样的事情。

  1. 第一个命令的行为符合预期,是一个简单的回显服务器,当客户端关闭连接时它会关闭。
  2. 行为类似于 1。
  3. 我可以连接到服务器,发送数据,但我从未收到任何回复。当我关闭客户端连接时,服务器将关闭。
  4. 无法连接到服务器,服务器永远监听。

答案1

这里的关键是打开 FIFO 是一个阻塞操作。只有open当两端都连接时,即一旦 fifo 打开以供读取和写入时,才会返回。

男人先进先出(7)

Normally, opening the FIFO blocks until the other end is opened also.

在第一种情况下,shell 分叉来执行管道,因此打开 fifo 进行读取 ( cat fifo) 和打开 fifo 进行写入 ( > fifo) 发生在不同的进程中,因此独立发生。

在第二种情况下,读打开和写打开 ( 3<>fifo) 在一个步骤中发生。

在第三种情况下,<(cat fifo)扩展为文件名,例如/dev/fd/42.所以就像你在跑步一样nc -l localhost 8888 /dev/fd/42 > fifo。您需要额外的内容<才能使其等效,例如 nc -l localhost 8888 < <(cat fifo) > fifo.

在第四种情况下,shell 尝试打开 fifo 进行读取 ( < fifo) 并打开它进行写入 ( > fifo) 作为同一进程的一部分。 shell 从左到右一次执行一个操作。因此它尝试打开fifo以供读取,并永远阻塞,等待某些内容打开fifo以进行写入。我想你会发现在这种情况下,nc甚至从未开始,并且端口从未打开用于监听。

相关内容