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

标签 c tcl

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/

相关文章:

TCL 命令 - 字符串修剪

c - 为什么 C 中的等式表达式中不允许使用结构?

c - Accept() 和 SIGUSR1 被意外触发

C - 需要帮助实现 ADT

namespaces - Tcl:获取命名空间下定义的所有变量

sqlite - sqlite3 eval中的tcl var替换

http-headers - 如何在 Openacs 中添加 HTTP header 字段?

python - 如何运行 Python 文件作为 C 文件的参数?

c - 如何在 C 中对齐这样的数字?

automation - (Tcl/Expect) 退出后清屏