他のプログラムとの連携
#このような処理向きの 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);
|
|---|