关闭命名文件描述符

时间:2016-05-31 18:24:55

标签: bash file-descriptor

我创建了一个像

这样的命名文件描述符
Obj

现在我要关闭它:

exec {gui_outfd}<>$gui_outpipe

这会产生

exec {gui_outfd}>&-

我做错了什么?

我的剧本中

编辑第330-357行:

./game.sh: line 338: read: 14: invalid file descriptor: Bad file descriptor

被叫函数:

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

1 个答案:

答案 0 :(得分:3)

......的组合

exec {gui_outfd}>&-

...之后没有进一步重定向或修改$gui_outfd ......

read -u $gui_outfd line || echo "nothing read"

......注定要像你描述的那样完全失败。

一旦进程关闭文件描述符,该进程此后就不能使用该FD,除非将其与新的打开文件描述相关联。这与任何其他可能具有相同文件打开的进程无关,或者与关闭其FD的那些进程的关系有什么关系。

在完成之前不要关闭FD。