2016-05-31 19 views
1

を閉じる私は今、私はそれを閉じたいというという名前のファイルに記述

exec {gui_outfd}<>$gui_outpipe 

のような名前のファイルディスクリプタを作成しました違う?

EDIT私のスクリプトの行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'サブプロセスによってまだ開いているはずです...更新されたOP – marmistrz

+0

を参照してください。しかし、@chepnerは正しいと思われます:問題の "$ GAME_BIN"プロセスでまだ開いていても、それを読み込もうとしているシェルでまだ開いているというわけではありません。 –

答えて

3

の組み合わせ...

exec {gui_outfd}>&- 

... ...

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

によって$gui_outfdのさらなるリダイレクトまたは変更を加えることなく続く...は、あなたはそれがない説明するように、正確に失敗する運命にあります。

プロセスがファイルディスクリプタをクローズすると、そのプロセスはその後、新しいオープンファイルディスクリプションに関連付ける以外はそのFDを使用できません。それは、同じファイルを開いている可能性がある他のプロセスや、FDを閉じたプロセスとの関係が何であっても何もしません。

FDが終了するまでFDを閉じないでください。

+0

しかし私はそれを閉じています。私はそれを読むことができるようにしたいが、私はGUIプロセスが終了すると、壊れたパイプが欲しい。どうすれば達成できますか? – marmistrz

+1

@marmistrz、あなたは誤解を持っています。ファイルは開いているか閉じています。それが開いている場合は、読み取りのみ、書き込みのみ、またはその両方を許可するかもしれませんが、半分を閉じることはできません。 '{gui_outfd}>& - 'と '{gui_outfd} <& - 'の間に機能的な違いはありません。 2つのプロセスの間にパイプが必要な場合は、おそらくシェルの組み込みパイプ演算子 '|'を考慮する必要があります。 –

関連する問題