2016-05-31 4 views
1

닫기 지금은 내가 그것을 닫을 것인지명명 된 파일을 설명

exec {gui_outfd}<>$gui_outpipe 

같은 이름의 파일 기술자를 생성 잘못된?

편집 내 스크립트에 줄 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는 매우 적절하다고 생각합니다 : FD 문제가 여전히 "$ 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} <& -'에는 기능상의 차이점이 없습니다. 두 프로세스 사이에 파이프를 원하면 쉘의 내장 파이프 연산자 인'|'을 고려해야합니다. –