Link to the example... on wiki.tcl.tk
这里有一个通过使用通过管道进行通信的可执行模块来扩展 tcl 的示例。 (位于标记为可执行模块 (EM) 的部分)
我已经使用 Ubuntu 和 Windows XP 编译了该程序。当我尝试运行测试模块的脚本时 - 它们都挂起。
示例中缺少什么?
最佳答案
看起来该示例缺少对管道输出侧的冲洗处理。数据被缓冲在操作系统缓冲区中(等待建立几千字节),而不是实际立即发送到其他进程。请注意,这种缓冲仅在输出定向到终端以外的其他设备时发生,因此在交互式测试时您不会看到它。 (如果写入大量数据,那么缓冲效率的提高才是赢家,这也不重要。)
在 C 端,在 main
函数顶部添加此行:
setvbuf(stdout, NULL, _IONBF, 0);
在 Tcl 端,在子程序启动后立即添加以下内容:
fconfigure $mathModule -buffering none
C 端也可以通过在每个 printf
之后使用 fflush
来完成。如果您遇到无法访问源代码的真实 C 程序,您仍然可以通过使用 unbuffer
程序(实际上是一个 Tcl 脚本,使用 Expect 的魔法让子进程认为它正在与终端对话)。 unbuffer
的一个缺点是它使用虚拟终端,该终端来自比普通旧进程 ID 更受限制的资源池(更不用说管道/文件描述符)。
关于c - 为什么扩展 TCL 示例不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7437797/