
編輯:將主要範例從 Zork Dungeon 變更為預設作業系統 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
to>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
...