编辑:将主要示例从 Zork Dungeon 更改为默认 OS shell。
我在一台现代机器上运行了一个控制台应用程序。我还有一台带超级串行卡的 Apple //e,它允许它通过串行 COM 连接充当哑终端(除此之外,详细信息毫无用处)。我可以使用 USB 串行端口很好地连接这两个设备。
当现代机器启动 Linux 时,通过配置 COM 设置并授予自己设备文件所属组的权限,我可以运行
$ bash </dev/ttyUSB1 >/dev/ttyUSB1 2>/dev/ttyUSB1
并在 Apple 上获得 bash 会话 - Linux 计算机充当服务器并运行程序,但输入和输出转到 Apple,它是一个简单的客户端。这也适用于更专用的程序,例如dungeon
(Zork)。
我如何在 Windows 中做同样的事情?显然,我无法完全复制上述解决方案,因为 Windows 只允许我COM
一次在一个地方打开一个端口 - 运行上述命令的 Windows 模拟,
C:\> cmd <COM4 >COM4 2>COM4
出现“访问被拒绝”错误。
我可以将数据发送到 COM 端口:
C:\> echo "Hello" >COM4
并从 COM 端口读取原始输入(包括控制字符和转义字符!):
C:\> type <COM4
但我无法同时在同一个或不同的过程中完成这两项工作。
我尝试使用 PuTTY 和 RealTerm,但这两个工具都只允许我从 Windows 机器操作 Apple,这证明连接有效,但方向与我想要的正好相反。如何托管 Windows 控制台应用程序以便从连接的终端进行访问?
答案1
编辑:问题澄清后“重新回答”
根据微软(我找不到Using command redirection operators
适用于 XP 以上版本的 Windows 部分):
复制句柄
& 重定向运算符将输出或输入从一个指定句柄复制到另一个指定句柄。例如,要将 dir 输出发送到 File.txt 并将错误输出发送到 File.txt,请键入:
目录>c:\file.txt 2>&1
复制句柄时,会复制该句柄原始实例的所有特征。例如,如果句柄具有只写访问权限,则该句柄的所有副本都具有只写访问权限。您不能将具有只读访问权限的句柄复制到具有只写访问权限的句柄中。
好消息是:
- 您可以更改
<COM4 >COM4 2>COM4
为<COM4 >&1 2>&1
。
坏消息是:
- 您正在混合只读
<COM4
和只写>&1 2>&1
句柄访问要求,并且正在更改Access Denied
为The handle could not be duplicated during redirection of handle 1
。
如果你改变:
<COM4 >&1 2>&1
到>COM4 2>&1 <&1
(只读和只写仍然混合)它可以工作并为您提供可用的STDOUT
和STDERR
,但STDIN
仍然似乎*被损坏。(*)我做了一些测试,但似乎STDIN
没有作用......
不过,我可以看到一个解决方法:
- 使用
com0com
零调制解调器模拟器并定义3个虚拟端口对:COM_O
-COM_O4
为了STDOUT
;COM_E
-COM_E4
为了STDERR
;COM_I
-COM_I4
为了STDIN
。
使用、和中的
hub4com.exe
(com0com
部分)制作串行集线器:COM_O4
COM_E4
COM_I4
COM4
hub4com.exe --route=0:1 --route=2,3:0 --baud=19200 --data=8 --parity=no --stop=1 --octs=off --odsr=off --ox=off --ix=off --idsr=off --ito=0 \\.\COM4 \\.\COM_I4 \\.\COM_E4 \\.\COM_O4
- 记得设置适当的(您自己的)传输参数:
--baud
...
并
<\\.\COM_I >\\.\COM_O 2>\\.\COM_E
形成命令行。
最后,对于:
hub4com.exe --route=0:1 --route=2,3:0 --octs=off \\.\COM4 \\.\COM_I4 \\.\COM_E4 \\.\COM_O4
和:
cmd <\\.\COM_I >\\.\COM_O 2>\\.\COM_E
您有一个 Windows 命令COM4
行19200 8N1
...