如何使用Tcl创建和重定向stdin/stdout/stderr以外的文件描述符?

如何使用Tcl创建和重定向stdin/stdout/stderr以外的文件描述符?,tcl,Tcl,阅读bash exec one可以创建和重定向标准管道以外的管道,例如exec 3>4 在阅读中没有提到非标准管道。似乎很明确 用例是一个启动程序,启动多个可执行文件通过多个管道(可能是循环方式)进行通信。我的想法是: lassign [chan pipe] a2b_read a2b_write exec a 3 3>@$a2b_write exec b 3 3<@$a2b_read ... …其中“a”是一个可执行文件,它使用一个文件描述符参数来控制a应该在何处写入内容,反之亦然

阅读bash exec one可以创建和重定向标准管道以外的管道,例如exec 3>4

在阅读中没有提到非标准管道。似乎很明确

用例是一个启动程序,启动多个可执行文件通过多个管道(可能是循环方式)进行通信。我的想法是:

lassign [chan pipe] a2b_read a2b_write
exec a 3 3>@$a2b_write
exec b 3 3<@$a2b_read
...
…其中“a”是一个可执行文件,它使用一个文件描述符参数来控制a应该在何处写入内容,反之亦然,用于可执行文件“b”。当可执行文件通过多个管道进行通信时,使用标准管道不起作用


我知道如何使用命名管道来实现这一点,但我更愿意将管道的生命周期与流程的生命周期联系起来。

Tcl根本没有dup的内置绑定,仅以非常有限的方式将dup2用于三个标准通道。如果没有这些,这个功能将无法工作。这是您需要的地方,在这里您可以完全控制通道处理和进程启动,并通过fork、dup和execl做任何您想做的事情;注意,这与exec完全不同,更像是POSIX系统调用


或者在一个下级shell脚本中进行欺骗。

我觉得这不受支持,解决方法是运行一个shell脚本来进行连接。@DonalFellows就是这样开始的。找不到如何创建进程绑定管道,如chan管道返回的管道。如果可以检索通道文件名,则可以通过传递文件名而不是文件描述符来解决问题,例如/proc/123/fd/$a2b_write,但这似乎也不可能。在sh中,您可以打开新的文件描述符exec 3>&4,这是dup系统调用。我认为Tcl没有dup功能。我在成龙或档案手册的任何地方都看不到它。第一句话的事实是通过对资料来源进行搜索而发现的;事实上,没有任何内置的技巧可以破解。TclX的dup可以做到这一切;它同时执行dup和dup2,这取决于您传递的参数。