통신

2017-10-31 7 views
0

나는 성공적으로 사용하여 내 GUI (TCL/TK)에 의해 호출 스크립트의 표준 출력을 리디렉션 할 수 있었다 "stop"버튼을 클릭하면 데이터 수집을 중지합니다 (무한 루프에 있음). exec을 통해 가능합니까 아니면 open을 사용해야합니까?통신

답변

1

exec 명령은 하위 프로세스가 완료 될 때까지 기다리지 만 컨트롤을 전혀 반환하지 않습니다 (백그라운드에서 완전히 실행되지 않은 경우 제외). 컨트롤을 유지하기 위해 당신은 파이프 라인을 열 필요가 :

# Not a read pipe since output is redirected 
set pipe [open |[list [info nameofexecutable] jtag.tcl >@$file_id] "w"] 

는 또한 다른 프로세스가 파이프가 닫혀있을 때를 수신하는지 확인 또는 완료 다른 쪽 끝을 말하는 몇 가지 다른 프로토콜이 필요합니다. 이를 수행하는 가장 쉬운 메커니즘은 원격 엔드가 파이프 (해당 stdin)를 비 차단 모드로 놓고 주기적으로 종료 메시지를 확인하는 것입니다. 서브 프로세스를 죽이고 결과를 데리러, 또는

puts $pipe "quit" 
close $pipe 

:

exec kill [pid $pipe] 
# Need the catch; this will throw an error otherwise because of the signal 
catch {close $pipe} 
# Testing for a quit message; put this in somewhere it can be called periodically 
if {[gets stdin] eq "quit"} { 
    exit 
} 

# Putting the pipe into nonblocking mode 
fconfigure stdin -blocking 0 
그런 다음 하위 프로세스의 종료 프로토콜은 부모 프로세스이 된다
+0

방금 ​​시도해 본 결과 g 너. 위대한 설명과 예제를 가져 주셔서 감사합니다. 완벽하게하려면 파이프를 안전하게 닫을 수있을 때 부모 프로세스에 신호를 보내려면 하위 프로세스가 필요합니다. 즉, 하위 프로세스는 'quit'키워드를 받고 하드웨어가있는 현재 트랜잭션을 완료하고 상위 프로세스에게 파이프를 닫으라고 지시합니다. 하위 프로세스 출력이 텍스트 파일로 리디렉션되기 때문에 충돌이있을 것으로 생각됩니다. – Dams0622