2017-01-12 9 views
0

私はTCLスクリプトの仕事を持っています。 メインスクリプトでは、私はそれをexecとfileeventを使用してサブプロセスを維持する

set AAA [exec tclsh "scriptA.tcl"] 

を行うには、execを使用して、新しいスクリプトを呼び出すことができると私は、プロセスを殺すためにEnterキーを押すことにより、サブプロセスを終了することができます。

fileevent stdin readable killproc 
vwait state 

今私はそれが私の サブプロセスは、完成に機能的に働いている場合、自動的に対応するプロセスを強制終了し、どのように私は、感謝をopenbgexecを使用しないことで実装することができ、PROC 仕事を殺す入りプレスを維持させるやりたい

答えて

0

あなたが最初のいずれかを実行します。

set AAA [exec tclsh "scriptA.tcl"] 

あなたがその文を入れてきたしたTclのプログラム(またはそのプログラムには少なくとも現在のスレッド)サブプロセスが完了するまで続行されません。 Tclは停止し、それを待ちます。

他の代替(つまりopenまたはbgexecを使用していない)最後の引数として&を置くことです:

set AAA [exec tclsh "scriptA.tcl" &] 

ただし、この場合にはサブプロセスがバックグラウンドで開始され、本当はありません直ちに続行されるマスタープロセスへの接続。この場合のAAA変数には、プログラムからの出力ではなく、サブプロセスのプロセスIDが含まれます。プラットフォームの通常のシステムツールでそのIDを使用して、そのIDを監視することができます。 (多くのUNIXは/proc/$processIDを見て、実行中のプロセスに関する情報を調べることはできませんが、標準化されておらず、そのディレクトリの内容はです。実際には標準化されていません。いくつかのプロセスIDを使用することができます。

Tcl 8.6では、サブプロセスの監視と処理のための他のオプションを追加しました。 OSが理解したchan pipeの片方向未処理パイプ(これは一対のチャンネルに接続されています)を使用して、closeの余分な引数を使用して双方向チャンネルの片端を閉じることができます。これにより、execでサブプロセスを作成したとしてもfileeventを使用してサブプロセスを監視するような操作を行うことができますが、その時点ではopenを使用するよりもはるかに単純ではありません。 execコマンドは、チャンネルをサブプロセスに直接接続することをサポートしていますが、実際にはそれらに関連付けられた実際のOSハンドルを持つチャンネル(パイプ、はい、ソケット、はい、端末、はい、ファイル、はい、chan create、 )。一般的に


、我々はあなたが物事をシンプルに保つことをお勧めします:あなたがサブプロセスを実行し、結果をすぐに待ちたいときのため

  • exec …
  • open |[list …]サブプロセスをバックグラウンドで実行して対話する場合(または同じ機能とわずかに異なるインターフェイスを提供するbgexec)の場合。 Tclのfileeventは、のパイプラインとターミナル、そしてソケットを備えています。
  • exec … &の場合は、バックグラウンドでサブプロセスを実行し、それに対する制御を完全に放棄したい場合に使用します。

実際に複雑なケースには、Expectパッケージがあります。

関連する問題