
BEARBEITEN:Primäres Beispiel von Zork Dungeon zur Standard-OS-Shell geändert.
Auf einem modernen Rechner läuft eine Konsolenanwendung. Außerdem habe ich ein Apple //e mit einer Super Serial Card, die es ermöglicht, es über eine serielle COM-Verbindung als einfaches Terminal zu verwenden (weitere Details sind nutzlos). Ich kann diese beiden Geräte problemlos über einen USB-Seriell-Port verbinden.
Wenn auf der modernen Maschine Linux gebootet ist, kann ich durch Konfigurieren der COM-Einstellungen und Einräumen von Rechten für die Gruppe, zu der die Gerätedatei gehört, Folgendes ausführen:
$ bash </dev/ttyUSB1 >/dev/ttyUSB1 2>/dev/ttyUSB1
und führe eine Bash-Sitzung auf dem Apple aus - die Linux-Maschine fungiert als Server und führt das Programm aus, aber Eingabe und Ausgabe gehen an den Apple, der ein einfacher Client ist. Dies funktioniert auch mit dedizierteren Programmen wie dungeon
(Zork).
Wie mache ich das Gleiche unter Windows? Offensichtlich kann ich die obige Lösung nicht exakt nachbilden, da ich unter Windows immer nur einen COM
Port gleichzeitig öffnen kann. Dazu führe ich das Windows-Äquivalent des obigen Befehls aus.
C:\> cmd <COM4 >COM4 2>COM4
gibt mir einen Zugriffsverweigerungsfehler aus.
Ich kann Daten an den COM-Port senden:
C:\> echo "Hello" >COM4
und lesen Sie die Roheingabe (einschließlich Steuer- und Escapezeichen!) vom COM-Port:
C:\> type <COM4
Aber ich kann nicht beides gleichzeitig tun, weder im selben noch in getrennten Prozessen.
Ich habe versucht, PuTTY und RealTerm zu verwenden, aber mit beiden konnte ich den Apple nur von der Windows-Maschine aus bedienen, was zwar beweist, dass die Verbindung funktioniert, aber genau in die entgegengesetzte Richtung von dem geht, was ich möchte. Wie hoste ich eine Windows-Konsolenanwendung für den Zugriff von einem verbundenen Terminal aus?
Antwort1
Bearbeiten:"Erneut beantwortet" nach Klärung der Frage
EntsprechendMicrosoft(Ich kann keinen Using command redirection operators
Abschnitt für Windows neuer als XP finden):
Griffe duplizieren
Der Umleitungsoperator & dupliziert die Ausgabe oder Eingabe von einem angegebenen Handle zu einem anderen angegebenen Handle. Um beispielsweise die Dir-Ausgabe an File.txt und die Fehlerausgabe an File.txt zu senden, geben Sie Folgendes ein:
dir>c:\datei.txt 2>&1
Wenn Sie einen Handle duplizieren, duplizieren Sie alle Merkmale des ursprünglichen Vorkommens des Handles. Wenn ein Handle beispielsweise nur Schreibzugriff hat, haben alle Duplikate dieses Handles nur Schreibzugriff. Sie können einen Handle mit schreibgeschütztem Zugriff nicht in einen Handle mit schreibgeschütztem Zugriff duplizieren.
Die gute Nachricht ist:
- Sie können
<COM4 >COM4 2>COM4
zu wechseln<COM4 >&1 2>&1
.
Die schlechte Nachricht ist:
- Sie mischen Anforderungen für den schreibgeschützten
<COM4
und schreibgeschützten>&1 2>&1
Handle-Zugriff und wechselnAccess Denied
zuThe handle could not be duplicated during redirection of handle 1
.
Wenn Sie Folgendes ändern:
<COM4 >&1 2>&1
zu>COM4 2>&1 <&1
(schreibgeschützt und schreibgeschützt sind immer noch gemischt), was funktioniert und Ihnen verwendbareSTDOUT
und gibtSTDERR
, aberSTDIN
immer noch* kaputt zu sein scheint. (*)Ich habe einige Tests durchgeführt, aber es scheint, dass esSTDIN
nicht funktioniert ...
Ich sehe jedoch einen Workaround zur Behebung des Problems:
- Verwenden
com0com
Nullmodem-Emulatorund definieren Sie 3 virtuelle Portpaare:COM_O
-COM_O4
fürSTDOUT
;COM_E
-COM_E4
fürSTDERR
;COM_I
-COM_I4
fürSTDIN
.
Erstellen Sie einen seriellen Hub mit
hub4com.exe
(com0com
Teil) ausCOM_O4
,COM_E4
,COM_I4
undCOM4
: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
- Denken Sie daran, die richtigen (Ihre eigenen) Übertragungsparameter einzurichten:
--baud
...
Und
<\\.\COM_I >\\.\COM_O 2>\\.\COM_E
bilden Sie eine Befehlszeile.
Und schließlich:
hub4com.exe --route=0:1 --route=2,3:0 --octs=off \\.\COM4 \\.\COM_I4 \\.\COM_E4 \\.\COM_O4
Und:
cmd <\\.\COM_I >\\.\COM_O 2>\\.\COM_E
Sie haben eine Windows-Befehlszeile COM4
aktiviert 19200 8N1
...