2011-09-15 14 views
2

Link to the example... on wiki.tcl.tkなぜTCLの例が機能しないのですか?

は、パイプを介して通信する実行可能モジュールの使用を介してTCLを拡張するため、ここでの例があります。 (実行可能モジュール(EM)のセクションにあります)

私はUbuntuとWindows XPを使用してプログラムをコンパイルしました。モジュールをテストするスクリプトを実行しようとすると、両方ともハングします。

例には何が欠けていますか?

答えて

3

パイプの出力側のフラッシングの処理が欠落しているように見えます。データは、実際にすぐに他のプロセスに送信されるのではなく、OSバッファ(数キロバイトの構築を待つ)でバッファされます。このバッファリングは、出力が端末以外のものに向けられている場合にのみ発生するので、対話的にテストするときには出力されません。 (そのバッファリングを有する改良された効率が勝者である場合に大量のデータが書き込まれている場合、そのことも重要ではない。)

C側では、main関数の先頭に次の行を追加します

setvbuf(stdout, NULL, _IONBF, 0); 
Tclの側で

、すぐにサブプログラムの始動後にこれを追加します。

fconfigure $mathModule -buffering none 

C側はまた、すべてのprintffflushを使用して行うことができます。あなたがソースにアクセスできない実際のCプログラムに悩まされている場合は、unbufferプログラム(実際にはExpectで魔法を使ってサブプロセスは端末と通信していると思う)。 unbufferの下側の1つは、仮想端末を使用することです。仮想端末は、通常の古いプロセスID(パイプ/ファイル記述子はもちろんですが)よりもはるかに制限されたリソースプールから得られます。

0

私はExpectを使用してCの例を使用して成功しています。学ぶもう一つのことですが、それは仕事を完了します。また、この例ではCコードを置き換えるためにflex/bisonを学習しています。

+0

これは期待しています。それは、それを実現させるためには大変なことがあります。 –

関連する問題