为什么不扩展TCL示例不起作用?

时间:2011-09-15 21:43:50

标签: c tcl

Link to the example... on wiki.tcl.tk

这里有一个例子,通过使用通过管道进行通信的可执行模块来扩展tcl。 (位于标记为可执行模块(EM)的部分)

我使用Ubuntu和Windows XP编译了程序。当我尝试运行测试模块的脚本时 - 它们都会挂起。

示例中缺少什么?

2 个答案:

答案 0 :(得分:3)

看起来这个例子错过了管道输出侧冲洗的处理。数据被缓冲在OS缓冲区中(等待几千字节建立起来)而不是实际上立即发送到另一个进程。请注意,此缓冲仅在将输出定向到终端以外的其他内容时发生,因此在交互式测试时您将看不到它。 (如果正在编写大量数据,当提高缓冲效率提高时,它也不重要。)

在C方面,在main函数顶部添加此行:

setvbuf(stdout, NULL, _IONBF, 0);

在Tcl一侧,在子程序启动后立即添加:

fconfigure $mathModule -buffering none

也可以在fflush之后使用printf来完成C侧。如果你坚持使用一个你无法访问源代码的真正的C程序,你仍然可以通过使用unbuffer程序包装整个程序来取得进展(实际上是一个使用魔法的Tcl脚本)期望让子进程认为它正在与终端通信)。 unbuffer的一个缺点是它使用的是虚拟终端,它来自比普通旧进程ID(更不用说管道/文件描述符)更受限制的资源池。

答案 1 :(得分:0)

我使用Expect成功使用示例C,它没有挂起。另一件需要学习的事情,但它完成了工作。另外,我正在学习flex / bison来替换示例中的C代码。