foo*_*foo 8 shell bash io-redirection process-substitution fifo
我的目标是使用nc
和单个fifo
. 我不是在寻找最好的方法来做到这一点,我只是想了解以下命令的语义(fork 何时发生,为什么,它发生了什么变化,为什么命令的行为不同......)。
我正在使用 Bash,所以我不确定所有命令是否都适用于 POSIXsh
或zsh
, 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
Run Code Online (Sandbox Code Playgroud)
现在我希望 4 个命令做同样的事情,至少最后两个命令做同样的事情。
这里的关键是打开一个 FIFO 是一个阻塞操作。在open
一旦FIFO是开放的读取和写入一次的两端只有回报连接,即。
Normally, opening the FIFO blocks until the other end is opened also.
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,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
.
在第 4 种情况下,作为同一进程的一部分,shell 尝试打开 fifo 进行读取 ( < fifo
) 并打开它进行写入 ( > fifo
)。外壳一次一个,从左到右。所以它试图打开fifo
读取,并永远阻塞,等待打开fifo
写入。我想你会发现在这种情况下,nc
甚至从来没有开始过,端口也从来没有打开过监听。
归档时间: |
|
查看次数: |
513 次 |
最近记录: |