【问题标题】:Get the output from Tcl C Procedures从 Tcl C 过程中获取输出
【发布时间】:2013-01-17 17:23:21
【问题描述】:

我有一个 C shell,它通常使用 Tcl_Eval 调用 Tcl 例程。通常我只需执行用户输入的内容并获得一些状态就可以了。但是,现在我需要从用户键入的命令接收实际的 stdio 输出。有什么方法可以使用Tcl C procedures 获取它吗?

附带说明:我需要找出 Tcl 解释器中可用的当前过程列表,包括内置的和用户来源的。基本上,info procs * 的输出。

【问题讨论】:

  • 从进程中截取标准输出是相当麻烦的。 Tcl-ish 的做法是简单地拦截它(而是只获取结果),或者如果你必须拦截,则在子进程中运行代码。

标签: tcl


【解决方案1】:

我认为你可以这样:

  1. 通过调用pipe(2) 创建管道。
  2. 然后在你的插播中:

    1. 通过调用Tcl_Close() 来关闭stdout
    2. 在关闭stdout 后立即调用Tcl_MakeChannel(),将管道的写结束文件描述符转换为Tcl 的stdout 通道。

    或者使用 stdout 替换为对 Tcl_SetStdChannel() 的调用。

  3. 处理来自管道的数据。

关于您的旁注——我认为您可以在解释器中调用 Tcl_Eval() 并使用 Tcl API 中的列表处理函数处理返回的列表。

更新(来自我的一个 cmets):经过深思熟虑后,我认为可以创建一个自定义 Tcl 通道,该通道的实现将保存写入它的数据然后注册像标准输出这样的通道的一个实例。请参阅Tcl_CreateChannel()Tcl_RegisterChannel()

【讨论】:

  • 处理列表听起来简单多了。但它将如何真正发挥作用? Tcl_Eval 只是返回状态。我应该使用哪个命令来获取返回的列表?
  • @ilya1725, Tcl_GetObjResult().
  • @ilya1725,经过深思熟虑后,我认为可能只创建一个自定义 Tcl 通道,该实现将保存写入它的数据,然后将此类通道的实例注册为 @ 987654338@。请参阅Tcl_CreateChannel()Tcl_RegisterChannel()
  • 有什么办法可以防止结果回显到标准输出?
  • @ilya1725,我不明白这个问题:如果你颠覆了stdout 频道,你的interp 中的procs 的输出不能被回显到stdout 的定义。那么你真正的意思是什么?你做了什么来捕获输出到你的procs的stdout?或者他们可能正在写信给stderr
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多