Ein- und Ausgabe eines Terminals mit c++ steuern

  • Hi!


    Hätte eine prinzipielle Frage zu c++ und den Terminals.
    Wäre es (ohne größeren Aufwand) möglich die Eingabe einer Konsole über ein c++-Programm zu steuern (d.h. das Programm füttert die Konsole) und dann das Ergebnis (also das gesamte "Bild" z.B. das Fenster des mc) wieder in das c++-Programm einzulesen. Die Eingabe müsste sich ja irgendwie umlenken lassen oder? Die Ausgabe kann ja auch "leicht" eingelesen werden, allerdings nur zeilenweise. Ich würde eine Möglichkeit suchen wo ich eben immer das komplette Fenster (ev. nur wenn eine Änderung geschehen ist) einlesen kann ... ggf. auch nur als Bild. Ginge das ev. mit einem VT von screen?


    Hat da jemand einen Gedankenanstoß bzw. ev. ein Codebeispiel für mich?


    Falls das ganze nicht sooo aufwändig wäre, könnte man damit ja die schönsten Sachen machen: z.B. mc über den VDR steuern usw ...


    Gruß,
    Brougs78

    - -- --- ================================================================ --- -- -
    Antec Fusion, Intel E5200, Asus P5N7A-VM (VDPAU), DD CineS2 v6 + DD DuoFlex CI // yavdr-0.6.1
    - -- --- ================================================================ --- -- -

  • Das was Du machen möchtest nennt sich Terminalemulation - nichts anderes macht z.B. ein xterm. Dabei wird einem Prozess ein virtuelles Terminal zur Verfügung gestellt. Das ist sowas wie eine Pipe in zwei Richtungen. Die eine Seite verhält sich genau wie eine Textkonsole, die andere Seite dient zum Empfangen und Steuern. Diese Seite benutzt xterm dann um die Ausgaben sichtbar zu machen und die Tastatureingaben an den Prozeß zu schicken.


    Die virtuellen Terminals sind notwendig, weil viele Programme merken wenn Du stdout oder stdin "einfach so" umleitest, und sich dann anders verhalten um z.B. scripten möglich zu machen. In einem virtuellen Terminal kannst Du dafür dann auch auf ANSI-Steuerzeichen reagieren und die Höhe/Breite vorgeben etc. Halt wie in einem xterm ;)


    Im wesentlichen öffnest Du dabei /dev/ptmx (die kontrollierende Seite) und erhälst dann über ptsname ein /dev/pts/* (die ausführende Seite). Wenn Dich das tiefer interessiert schlag mal die Manpages pts, grantpt und unlockpt nach.

  • Hi!


    Danke für die Antworten. Das klingt nicht ganz so trivial wie erhofft.
    Werde mich mal versuchen ein wenig in die Materie einzulesen ...


    Gruß,
    Brougs78

    - -- --- ================================================================ --- -- -
    Antec Fusion, Intel E5200, Asus P5N7A-VM (VDPAU), DD CineS2 v6 + DD DuoFlex CI // yavdr-0.6.1
    - -- --- ================================================================ --- -- -

  • Hi nochmal!


    Also das ganze würde ja bedeuten dass ich mir sozusagen ein Programm wie xterm selber schreiben müsste. Also die Eingaben richtig interpretieren und dann die Ausgabe "rendern".
    Gibt es nicht ev. ne einfache Lösung mittels z.B. screen. Dass ich innerhalb einer screen-Session mc starte und dann die Eingabe an screen (und dadurch mc) aus "meinem Programm" erfolgt. Für die Ausgabe wäre eigentlich ideal wenn ich einfach den Terminalinhalt als Screenshot bekommen könnte ...


    Oder ginge sowas im Falle dass die Ausgabe auf dem FrameBuffer erfolgen würde?


    Vielleicht hat ja jemand einen Tipp ... ein paar Namen von Tools die ich vielleicht nicht kenne die mir da in dieser Richtung weiter helfen könnten. Das ganze sollte aber ohne X auskommen.


    Gruß,
    Brougs78

    - -- --- ================================================================ --- -- -
    Antec Fusion, Intel E5200, Asus P5N7A-VM (VDPAU), DD CineS2 v6 + DD DuoFlex CI // yavdr-0.6.1
    - -- --- ================================================================ --- -- -

  • Hi!


    Das klingt interessant; muss ich mal testen was da daherkommt. Da werden aber eher noch Steuerzeichn usw. dabei sein nehme ich an ...


    Gruß,
    Brougs78

    - -- --- ================================================================ --- -- -
    Antec Fusion, Intel E5200, Asus P5N7A-VM (VDPAU), DD CineS2 v6 + DD DuoFlex CI // yavdr-0.6.1
    - -- --- ================================================================ --- -- -

  • Hi!


    LordJaxom: Was meinst du mit Master-PTY?


    Ich wollte da noch einmal nachhaken. Also wenn ich /dev/vcs* auslese bekomme ich genau die Konsoleninhalte, allerdings nur als Plain-Text. Wenn ich /dev/vcsa* auslese bekomme ich den Text mit Attributen ... da müsste sich also das ganze mit Farbe usw. rendern lassen. Nur wäre mir das zu viel Aufwand die ganzen Codes interpretieren zu müssen wenn das ganze sowieso eigentlich schon in fertiger Form vorliegen müsste.


    Gibt es wirklich keine Möglichkeit einen Screenshot (alos als fertiges Bild mit den richtigen Farben usw.) von einer der Konsolen zu erstellen?
    Für den Frambuffer kann man ja /dev/fb* auslesen und das lässt sich in ein Bild wandeln ... sowas müsste doch auch für die normale Konsole funktionieren oder?


    BTW, wie könnte ich eigentlich feststellen welches /dev/vcs* z.B. die aktuelle Putty-Session belgt bzw. eine Screen-Session?


    Gruß,
    Brougs78

    - -- --- ================================================================ --- -- -
    Antec Fusion, Intel E5200, Asus P5N7A-VM (VDPAU), DD CineS2 v6 + DD DuoFlex CI // yavdr-0.6.1
    - -- --- ================================================================ --- -- -

  • Hi!


    Zitat

    Original von slime
    zumindest letzteres kannst du mit lsof feststellen.


    Hmmm ... kapier ich nicht ganz. lsof liestet ja die offenen Dateien oder? Wie kann ich da die Konsole herausfinden?
    Wenn ich z.B. screen start finde ich da auch kein entsprechendes Device ...


    Gruß,
    Brougs78

    - -- --- ================================================================ --- -- -
    Antec Fusion, Intel E5200, Asus P5N7A-VM (VDPAU), DD CineS2 v6 + DD DuoFlex CI // yavdr-0.6.1
    - -- --- ================================================================ --- -- -

  • Zitat

    Original von Brougs78
    LordJaxom: Was meinst du mit Master-PTY?


    Na die steuernde Seite eines virtuellen Terminals. Da kommt nix anderes raus als aus /dev/vcs*, nur dass Du keine virtuelle Konsole verplempern musst sondern den Prozess selbst kontrollieren kannst.


    Zitat

    Ich wollte da noch einmal nachhaken. Also wenn ich /dev/vcs* auslese bekomme ich genau die Konsoleninhalte, allerdings nur als Plain-Text. Wenn ich /dev/vcsa* auslese bekomme ich den Text mit Attributen ... da müsste sich also das ganze mit Farbe usw. rendern lassen. Nur wäre mir das zu viel Aufwand die ganzen Codes interpretieren zu müssen wenn das ganze sowieso eigentlich schon in fertiger Form vorliegen müsste.


    Was heisst in fertiger Form? Als Screenshot, also pixelbasierte Grafik?

  • in etwa so meine ich das:

    Code
    slime@colo16:~$ lsof | grep pts
    bash       5763       slime    0u      CHR  136,6                 8 /dev/pts/6
    bash       5763       slime    1u      CHR  136,6                 8 /dev/pts/6
    bash       5763       slime    2u      CHR  136,6                 8 /dev/pts/6
    bash       5763       slime  255u      CHR  136,6                 8 /dev/pts/6
    lsof       5770       slime    0u      CHR  136,6                 8 /dev/pts/6
    lsof       5770       slime    2u      CHR  136,6                 8 /dev/pts/6
    grep       5772       slime    1u      CHR  136,6                 8 /dev/pts/6
    grep       5772       slime    2u      CHR  136,6                 8 /dev/pts/6


    probier mal mit cat etwas auf das device zu schreiben, das kommt dann direkt in der console an:

    Code
    slime@colo16:~$ echo test  > /dev/pts/1
    slime@colo16:~$ echo test  > /dev/pts/6
    test
  • Hi!


    LordJaxom: Ja genau. Ich suche eine Möglichkeit das als reine Pixelgrafik zu bekommen.


    slime: Ah ok. Das hat funktioniert. Danke.


    Gruß,
    Brougs78

    - -- --- ================================================================ --- -- -
    Antec Fusion, Intel E5200, Asus P5N7A-VM (VDPAU), DD CineS2 v6 + DD DuoFlex CI // yavdr-0.6.1
    - -- --- ================================================================ --- -- -

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!