读取所有输入后,如何关闭 FIFO 的所有读取器?似乎我只能关闭其中一个,这使我的程序无法完成。
这是一个有效的示例程序(测试将其放入文件中):
set -euo pipefail
rm -f todo.pipe
mkfifo todo.pipe
rm -f output.pipe
mkfifo output.pipe
cat todo.pipe | \
while read line && echo hej $line; do :; done \
> output.pipe &
echo "adam\n bertil\n carl" > todo.pipe &
cat < output.pipe
正如预期的那样,输出是:
❯ ./test.zsh
hej adam
hej bertil
hej carl
❯
但是,如果我添加另一个线程来处理这些事情todo.pipe
,事情就会永远挂起:
set -euo pipefail
rm -f todo.pipe
mkfifo todo.pipe
rm -f output.pipe
mkfifo output.pipe
cat todo.pipe | \
while read line && echo hej $line; do :; done \
> output.pipe &
# The below 3 lines is all that's changed
cat todo.pipe | \
while read line && echo hej $line; do :; done \
> output.pipe &
echo "adam\n bertil\n carl" > todo.pipe &
cat < output.pipe
现在,它的打印结果和以前一样,但它永远不会返回。为什么?我怎样才能解决这个问题?
我的怀疑是第二个“工作线程”现在获得了 EOF 或类似的东西,但感觉就像我在这里遗漏了一些基本的东西。