【问题标题】:Tcl open channelTcl 开放通道
【发布时间】:2016-03-17 22:13:20
【问题描述】:

如何在 tcl 中打开一个不是文件名的频道?我已经阅读了文档,但我不是程序员,所以我不能理解 open 和 chan 命令,因为当我尝试打开新的自定义频道时

open customchannel1 RDWR

我收到诸如

之类的错误

无法执行“customchannel1”:没有这样的文件或目录

而且我完全清楚我没有正确执行此操作:

chan create read customchannel1

无效的命令名称“customchannel1” ...和...无效的命令名称“initialize”

我想要的只是两个 tcl 脚本能够相互交谈。我想我可以使用渠道来做到这一点。

不过,我已经成功创建了我想要的套接字测试版本:

proc accept {chan addr port} {
    puts "$addr:$port says [gets $chan]" 
    puts $chan goodbye                   
    close $chan                          
}                                        

puts -nonewline "master or slave? "
flush stdout
set name [gets stdin]

if {$name eq "master"} {
  puts -nonewline "Whats the port? "
  flush stdout
  set port [gets stdin]
  socket -server accept $port
  vwait forever
} else {
  puts "slave then."
  puts -nonewline "Whats the id? "
  flush stdout
  set myid [gets stdin]
  set chan [socket 127.0.0.1 $myid]
  puts $chan hello
  flush $chan
  puts "127.0.0.1:$myid says [gets $chan]"
  close $chan
}

在上面的示例中,我可以运行 3 个程序实例:2 个具有不同端口号的“主设备”,以及一个“从设备”,可以根据它选择的端口/“ID”与任一设备通信。

如果我知道如何使用 open 命令而不是 socket 命令打开通道,我可以在不使用套接字或 jimmy-rigging 端口以用作 uniq id 的情况下实现上述代码,但我能找到的每个示例都会打开文件并写出您不必首先创建的文件或标准输出。

感谢您帮助我理解这些概念以及如何更好地实施它们!

【问题讨论】:

  • 我会坚持使用套接字。您可能想使用 FIFO 或 tcl::chan::* 模块 in tcllib 进行调查

标签: tcl ipc channel


【解决方案1】:

将两个脚本连接在一起时,您可能会考虑使用管道。例如,您可以将一个脚本作为另一个脚本的从属进程运行。主人这样做:

set pipe [open |[list [info nameofexecutable] $thescriptfile] "r+"]

获得一个双向(因为r+)管道与孩子交谈,而孩子又可以正常使用stdout和stdin。

在一个进程中,chan pipe 可用,它返回一对由操作系统匿名管道连接的通道。


使用这些时,如果您记得使用fconfigure-buffering 转换为none,这真的很有帮助。否则,当管道的输出位于某个缓冲区中时,您可能会遇到死锁,这是您不想要的。最终的答案是使用 Expect,它使用 Unix ptys 而不是管道,但如果您记得调整缓冲,您可以非常高效。

【讨论】:

  • 据我了解,这会打开它可以与之通信的文件,但是我怎样才能获得一个已经运行的程序的开放通道?有没有办法在不实际打开程序的新实例的情况下做到这一点?
【解决方案2】:

通道只是处理已打开文件或套接字的高级方法。

来自手册页:

该命令提供了几个操作用于读取、写入和以其他方式操作打开的通道(例如使用 open 和 socket 命令创建的,或者对应于进程标准输入的默认命名通道 stdin、stdout 或 stderr,分别输出和错误流)。

所以你用套接字做的事情是正确的。可以使用chan命令来配置打开的socket。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    相关资源
    最近更新 更多