Link to the example... on wiki.tcl.tk
这里有一个例子,通过使用通过管道进行通信的可执行模块来扩展tcl。 (位于标记为可执行模块(EM)的部分)
我使用Ubuntu和Windows XP编译了程序。当我尝试运行测试模块的脚本时 - 它们都会挂起。
示例中缺少什么?
答案 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代码。