Ncurses Programme in Pseudo-Terminals

8

In meinem fortgesetzten Versuch, zu verstehen, wie Pseudo-Terminals funktionieren, habe ich ein kleines Programm geschrieben, um zu versuchen, bash auszuführen.

Das Problem ist, mein Zeilenumbruch scheint ausgeschaltet zu sein. (Die Shell-Eingabeaufforderung erscheint nur NACH dem Drücken von Enter.)

Außerdem kann ich ncurses-Programme wie vi immer noch nicht richtig benutzen. Kann mir jemand sagen, wie ich das Pseudo-Terminal dafür einrichten soll?

Mein schlecht geschriebenes Programm kann hier gefunden werden, ich ermutige Sie, es zu kompilieren . Das Betriebssystem ist GNU / Linux, danke.

EDIT: Kompilieren Sie so: gcc program.c -lutil -o Programm

BEARBEITUNG WIEDER: Es sieht so aus, als ob das Problem mit seltsamen Abständen auf printf () zurückzuführen ist, das Problem mit ncurses-Programmen wird jedoch immer noch nicht behoben.

    
Irresponsible Newb 07.12.2011, 01:29
quelle

1 Antwort

4

Es gibt mehrere Probleme in Ihrem Programm. Einige sind relativ einfach zu reparieren - andere nicht so sehr:

  1. forkpty() und seine Freunde kommen von BSD und sind nicht POSIX-kompatibel . Sie sollten für neue Programme vermieden werden. Von der pty(7) manual page :

      

    Historisch gesehen haben sich zwei pseudoterminale APIs entwickelt: BSD und System V. SUSv1 standardisierte eine pseudoterminale API basierend auf der System V API, und diese API sollte in allen neuen Programmen verwendet werden, die pseudo-terminal verwenden.

    Sie sollten stattdessen posix_openpt() verwenden. Dieses Problem ist wahrscheinlich nicht kritisch, aber Sie sollten sich dessen bewusst sein.

  2. Sie mischen Aufrufe mit unformatierten Systemaufrufen ( read() , write() ) und Datei-Stream ( printf() , fgets() ) Funktionen. Dies ist eine sehr gute Möglichkeit, sich selbst zu verwirren. Im Allgemeinen sollten Sie one Ansatz wählen und dabei bleiben. In diesem Fall ist es wahrscheinlich am besten, die Systemaufrufe auf niedriger Ebene zu verwenden ( read() , write() ), um Probleme zu vermeiden, die sich aus dem Vorhandensein der von den C-Bibliotheksfunktionen verwendeten E / A-Puffer ergeben würden." / p>

  3. Sie gehen von einem zeilenbasierten Paradigma für Ihre Terminals aus, indem Sie printf() und fgets() . Dies ist nicht immer richtig, besonders wenn es um interaktive Programme wie vim geht.

  4. Sie gehen von einem C-style-String-Paradigma mit einem Byte und einem Null-Ende aus. Terminals behandeln normalerweise Zeichen und Bytes - keine Zeichenketten. Und während die meisten Zeichensatzcodierungen die Verwendung eines Nullbytes vermeiden, tun dies nicht alle .

  5. Aufgrund von (2), (3) und (4) oben verwenden Sie nicht read() und write() korrekt. Sie sollten ihre Rückgabewerte verwenden, um zu bestimmen, wie viele Bytes sie verarbeitet haben, nicht string-basierte Funktionen wie strlen() .

  6. Dies ist das Problem, das meiner Meinung nach am schwierigsten zu lösen sein wird: Sie gehen implizit davon aus:

    • Das Terminal (oder sein Treiber) ist zustandslos: Es ist nicht. Zeitraum. Es gibt mindestens zwei statusbehaftete Steuerelemente, von denen ich vermute, dass sie die Ursache dafür sind, dass ncurses-basierte Programme nicht ordnungsgemäß funktionieren: Die Zeile Modus und das lokale Echocontrol des Terminals. Zumindest müssen diese zwischen dem Eltern / Master- und dem Slave-Terminal übereinstimmen, um verschiedene seltsame Artefakte zu vermeiden.

    • Die Control-Schnittstelle eines Terminals kann nur übergeben werden, indem die Bytes vor und zurück übergeben werden: Das ist nicht immer so. Moderne virtuelle Terminals ermöglichen eine Out-of-Band-Steuerung über ioctl() Aufrufe, wie für Linux beschrieben hier .

    Der einfachste Weg, um mit diesem Problem umzugehen, besteht wahrscheinlich darin, das übergeordnete Terminal in den Raw-Modus zu versetzen und den Slave-Pseudo-Terminal-Treiber mit den unangenehmen Details fertig zu werden.

Vielleicht möchten Sie sich dieses Programm ansehen funktioniert gut. Es kommt aus dem Buch Die Linux-Programmierschnittstelle und der vollständige Quellcode ist hier . Haftungsausschluss: Ich habe das Buch weder gelesen noch promote ich es - ich habe das Programm nur mit Google gefunden.

    
thkala 17.12.2011, 11:26
quelle

Tags und Links