2016-05-31 101 views
1

我創造了這樣的關閉了一個名爲文件描述符

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 
} 
+2

它看起來更像是一個進程試圖在關閉它之後從描述符中讀取而不是關閉本身的問題。 – chepner

+0

@chepner \t 是的,但文件描述符應該仍然由'run_gui'子進程打開,因爲它是一個子shell ...請參閱更新的OP – marmistrz

+0

然而,我認爲@chepner很可能是正確的:僅僅因爲FD問題仍然在「$ GAME_BIN」進程中打開並不意味着它仍然在試圖從中讀取的shell中打開。 –

回答

3

的組合...

exec {gui_outfd}>&- 

...隨後沒有進一步重定向或$gui_outfd通過修改...

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

...註定你描述它失敗完全是。

一旦一個進程關閉了一個文件描述符,該進程就無法使用該FD,除非將該進程關聯到新的打開文件描述之後。這與任何可能有相同文件打開的其他進程沒有任何關係,或者與關閉其FD的進程之間的關係可能是什麼。

在完成之前不要關閉FD。

+0

但是我只是爲了寫作而不是爲了閱讀而關閉它。我希望能夠閱讀它,但是當GUI進程退出時,我想要一個破損的管道。我怎樣才能實現它? – marmistrz

+1

@marmistrz,你有一個誤解。文件打開或關閉。如果它是開放的,那麼它可能只允許閱讀或只寫或兩者兼備,但你不能一半關閉它。 '{gui_outfd}>& - '和'{gui_outfd} <& - '之間沒有功能上的區別。如果你需要兩個進程之間的管道,那麼也許你應該考慮shell的內置管道運算符'|'。 –

相關問題