Link to the example... on wiki.tcl.tkなぜTCLの例が機能しないのですか?
は、パイプを介して通信する実行可能モジュールの使用を介してTCLを拡張するため、ここでの例があります。 (実行可能モジュール(EM)のセクションにあります)
私はUbuntuとWindows XPを使用してプログラムをコンパイルしました。モジュールをテストするスクリプトを実行しようとすると、両方ともハングします。
例には何が欠けていますか?
Link to the example... on wiki.tcl.tkなぜTCLの例が機能しないのですか?
は、パイプを介して通信する実行可能モジュールの使用を介してTCLを拡張するため、ここでの例があります。 (実行可能モジュール(EM)のセクションにあります)
私はUbuntuとWindows XPを使用してプログラムをコンパイルしました。モジュールをテストするスクリプトを実行しようとすると、両方ともハングします。
例には何が欠けていますか?
パイプの出力側のフラッシングの処理が欠落しているように見えます。データは、実際にすぐに他のプロセスに送信されるのではなく、OSバッファ(数キロバイトの構築を待つ)でバッファされます。このバッファリングは、出力が端末以外のものに向けられている場合にのみ発生するので、対話的にテストするときには出力されません。 (そのバッファリングを有する改良された効率が勝者である場合に大量のデータが書き込まれている場合、そのことも重要ではない。)
C側では、main
関数の先頭に次の行を追加します
setvbuf(stdout, NULL, _IONBF, 0);
Tclの側で
、すぐにサブプログラムの始動後にこれを追加します。
fconfigure $mathModule -buffering none
C側はまた、すべてのprintf
後fflush
を使用して行うことができます。あなたがソースにアクセスできない実際のCプログラムに悩まされている場合は、unbuffer
プログラム(実際にはExpectで魔法を使ってサブプロセスは端末と通信していると思う)。 unbuffer
の下側の1つは、仮想端末を使用することです。仮想端末は、通常の古いプロセスID(パイプ/ファイル記述子はもちろんですが)よりもはるかに制限されたリソースプールから得られます。
私はExpectを使用してCの例を使用して成功しています。学ぶもう一つのことですが、それは仕事を完了します。また、この例ではCコードを置き換えるためにflex/bisonを学習しています。
これは期待しています。それは、それを実現させるためには大変なことがあります。 –