关闭命名文件描述符
Closing a named file descriptor
我创建了一个这样的命名文件描述符
exec {gui_outfd}<>$gui_outpipe
现在我想关闭它:
exec {gui_outfd}>&-
这会产生
./game.sh: line 338: read: 14: invalid file descriptor: Bad file descriptor
我做错了什么?
编辑 我脚本中的第 330-357 行:
run_gui & gui_pid=$!
run_ai1 & ai1_pid=$!
exec {gui_outfd}>&-
while true; do
echo "Started the loop"
while true; do
eval $(isalive2 $gui_pid $ai1_pid)
read -u $ai1_outfd line || echo "Nothing read"
if [[ $line ]]; then # line 338
echo "Piping to GUI $line"
echo "$line" >&$gui_infd
if [[ "$line" == "END_TURN" ]]; then
break
fi
fi
done
echo TURNCHANGED
while true; do
read -u $gui_outfd line || echo "nothing read"
if [[ $line ]]; then
echo "Piping to AI $line"
echo "$line" >&$ai1_infd
if [[ "$line" == "END_TURN" ]]; then
break
fi
fi
done
done
以及调用的函数:
run_gui()
{
exec "$GAME_BIN" $args <&$gui_infd >&$gui_outfd
}
run_ai1()
{
exec "$ai1" <&$ai1_infd >&$ai1_outfd
}
...的组合
exec {gui_outfd}>&-
... 之后没有进一步重定向或修改 $gui_outfd
由 ...
read -u $gui_outfd line || echo "nothing read"
...注定会像您描述的那样失败。
一旦一个进程关闭了一个文件描述符,除非将它与一个新的打开的文件描述相关联之后,该进程就不能再使用这个 FD。这与可能打开相同文件的任何其他进程无关,也与此类进程与关闭其 FD 的进程之间的关系无关。
在完成之前不要关闭 FD。
我创建了一个这样的命名文件描述符
exec {gui_outfd}<>$gui_outpipe
现在我想关闭它:
exec {gui_outfd}>&-
这会产生
./game.sh: line 338: read: 14: invalid file descriptor: Bad file descriptor
我做错了什么?
编辑 我脚本中的第 330-357 行:
run_gui & gui_pid=$!
run_ai1 & ai1_pid=$!
exec {gui_outfd}>&-
while true; do
echo "Started the loop"
while true; do
eval $(isalive2 $gui_pid $ai1_pid)
read -u $ai1_outfd line || echo "Nothing read"
if [[ $line ]]; then # line 338
echo "Piping to GUI $line"
echo "$line" >&$gui_infd
if [[ "$line" == "END_TURN" ]]; then
break
fi
fi
done
echo TURNCHANGED
while true; do
read -u $gui_outfd line || echo "nothing read"
if [[ $line ]]; then
echo "Piping to AI $line"
echo "$line" >&$ai1_infd
if [[ "$line" == "END_TURN" ]]; then
break
fi
fi
done
done
以及调用的函数:
run_gui()
{
exec "$GAME_BIN" $args <&$gui_infd >&$gui_outfd
}
run_ai1()
{
exec "$ai1" <&$ai1_infd >&$ai1_outfd
}
...的组合
exec {gui_outfd}>&-
... 之后没有进一步重定向或修改 $gui_outfd
由 ...
read -u $gui_outfd line || echo "nothing read"
...注定会像您描述的那样失败。
一旦一个进程关闭了一个文件描述符,除非将它与一个新的打开的文件描述相关联之后,该进程就不能再使用这个 FD。这与可能打开相同文件的任何其他进程无关,也与此类进程与关闭其 FD 的进程之间的关系无关。
在完成之前不要关闭 FD。