Ich möchte einen einfachen, dummen X-Terminal-Emulator in C auf einem Linux-System schreiben.Wie funktionieren * nix Pseudo-Terminals? Was ist der Master/Slave-Kanal?
Zuerst dachte ich nur, ich müsste eine Shell poppen und ihre Ausgabe anzeigen. Ich habe Xterm und RXVT-Code überprüft, und es sieht ein bisschen komplizierter aus.
Zuerst muss ich ein Pseudo-Terminal mit openpty öffnen. Also schaue ich auf die man-Seite und sehe, dass openpty 2 Dateideskriptoren füllt, den Master und den Slave. Sowohl xterm als auch rxvt-Code sind wegen der systemabhängigen Eigenschaften dieser speziellen Dateien unübersichtlich.
Ich verstehe die termios Sachen: es ist nur eine Reihe von Informationen über den Escape-Code des Terminals. Was ich wirklich nicht verstehe, ist: Was soll ich mit dem Master/Slave-Dateideskriptor machen?
Ein Beispielprogramm, das ein Terminal öffnet, sich anmeldet und ein "ls" auf der Shell ausführt, wäre großartig.
(Englisch ist nicht meine Muttersprache, meinen eventuellen Fehler entschuldigen)
Edit: Hier ist der Beispielcode kam ich mit:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <pty.h>
#include <utmp.h>
#include <ctype.h>
void
safe_print (char* s)
{
while(*s) {
if(*s == '\n')
putchar("\n");
else if(iscntrl(*s))
printf("\\e(%d)", *s);
else
putchar(*s);
s++;
}
}
int
main (int argc, char** argv)
{
char buf[BUFSIZ] = {0};
int master;
int ret = forkpty(&master, NULL, NULL, NULL);
if(ret == -1)
puts("no fork"), exit(0);
if(!ret) {
execl("/bin/sh", "sh", NULL);
exit(0);
}
sleep(1); /* let the shell run */
if(argc >= 2) {
write(master, argv[1], strlen(argv[1]));
write(master, "\n", 1);
} else {
write(master, "date\n", sizeof "date\n");
}
while(1) {
switch(ret = read(master, buf, BUFSIZ)) {
case -1:
puts("error!");
exit(1);
break;
case 0:
puts("nothing.."), sleep(1);
break;
default:
buf[ret] = '\0';
safe_print(buf);
}
}
close(master);
return 0;
}
Das Befehlszeilenprogramm namens "Bildschirm" verwendet dies, denke ich. Damit können Sie eine angemeldete Konsole auf dem Host haben, und wenn Sie abgewiesen werden, können Sie sich wieder anmelden und die Verbindung mit dieser Sitzung wiederherstellen und fortfahren. Das ist die Essenz der Pty. Es hat einen Kanal, der mit dem Host-System interagiert, und einen "Rückkanal", der Ihnen extern sagt, was zu tun ist (und die Ergebnisse sehen). Auch ich habe keine wirklichen Erfahrungen mit der Implementierung eines; Ich habe über sie in "Linux Application Development" gelesen. Unter X denke ich, es gibt mehr Schaufensterdekoration, aber das zugrunde liegende Prinzip sollte sein – gbarry