#このような処理向きの Expect という拡張 Tcl もあるそうです.参考まで.
下に示すのは完全に動作するバージョンです.無限ループするので,Ctrl-c を 入力して適当に止める必要があります.C 側での出力に "\n" を付けないように して下さい.これを行なうと,tk 側での gets を 2 度処理する必要が出てきま す.
[Tcl 側]
#!/usr/local/bin/tclsh set fid [open "| ./foo" "r+"] ;# プログラム foo を r+/w+ モードで起動 puts $fid "tcl:" ;# 相手プログラムへの初期値の出力 flush $fid ;# バッファのフラッシュ(重要) while {[gets $fid str]>=0} { ;# 読み込み puts "tcl:$str" ;# 画面への出力 puts $fid "tcl:$str" ;# 相手プログラムへの初期値の出力 flush $fid ;# バッファのフラッシュ(重要) } |
---|
[C 側 (プログラム foo となる側)]
#include |
---|
[Tcl 側 (呼び出し側)]
set f [open "| $comname" r+] ######################################## # Parameter Output puts $f "\$var_a=$var_a;" puts $f "\$var_b=$var_b;" puts $f "\$var_c=$var_c;" puts $f "#end" flush $f ######################################## # Data Read while {[gets $f data]>=0} { ... |
---|
[C 側 (呼び出され側)]
#define STRNUM 512 char str[STRNUM]; int var_a, var_b, var_c; while (!feof(stdin)) { fgets(str, STRNUM, stdin); if (strncmp_cnt("$var_a=", str, &n)==0) { var_a=atoi(&str[n]); } else if (strncmp_cnt("$var_b=", str, &n)==0) { var_a=atoi(&str[n]); } else if (strncmp_cnt("$var_c=", str, &n)==0) { var_a=atoi(&str[n]); } else if (strncmp_cnt("#end", str, &n)==0) { break; } else { fprintf(stderr, "Unexpected variable specified.\n"); } } |
---|
この C 側の処理をもし Perl で書くと次のようにとても簡単になる.
[Perl 側 (呼び出され側)]
# パラメータを読み込んで評価 $line=""; while (<>) { last if /^#end/; $line.=$_; } eval($line); |
---|