ncurses benötigt einen Anschluss, weil er die E/A-Verbindung initialisiert. Ein FIFO wäre nicht geeignet, da es einseitig ist und (siehe zum Beispiel Perform action if input is redirected) wahrscheinlich nicht als Terminal initialisiert werden kann. ncurses verwendet die Umgebungsvariable , um die Terminalbeschreibung nachzuschlagen (das aktuelle Terminal wird in dieser Angelegenheit nicht konsultiert).
Es gibt ein einfaches Beispiel, ditto
in ncurses-examples, das xterm
für mehrere Eingabe/Ausgabe-Bildschirme verwendet. Das nutzt die pty-Schnittstelle, zum Beispiel
#ifdef USE_XTERM_PTY
int amaster;
int aslave;
char slave_name[1024];
char s_option[sizeof(slave_name) + 80];
const char *xterm_prog = 0;
if ((xterm_prog = getenv("XTERM_PROG")) == 0)
xterm_prog = "xterm";
if (openpty(&amaster, &aslave, slave_name, 0, 0) != 0
|| strlen(slave_name) > sizeof(slave_name) - 1)
failed("openpty");
if (strrchr(slave_name, '/') == 0) {
errno = EISDIR;
failed(slave_name);
}
sprintf(s_option, "-S%s/%d", slave_name, aslave);
if (fork()) {
execlp(xterm_prog, xterm_prog, s_option, "-title", path, (char *) 0);
_exit(0);
}
fp = fdopen(amaster, "r+");
if (fp == 0)
failed(path);
#else
und newterm
dass Dateideskriptor ncurses weitergeben müssen:
static void
open_screen(DITTO * target, char **source, int length, int which1)
{
if (which1 != 0) {
target->input =
target->output = open_tty(source[which1]);
} else {
target->input = stdin;
target->output = stdout;
}
target->which1 = which1;
target->titles = source;
target->length = length;
target->fifo.head = -1;
target->screen = newterm((char *) 0, /* assume $TERM is the same */
target->output,
target->input);
if (target->screen == 0)
failed("newterm");
(void) USING_SCREEN(target->screen, init_screen, target);
}
Wenn Sie die erste zitierte Abschnitt von ditto
lesen, werden Sie feststellen, dass es eine option of xterm
verwendet der es ermöglicht, eine Anwendung einen Dateideskriptor zu übergeben:
-Sccn This option allows xterm to be used as an input and output
channel for an existing program and is sometimes used in spe-
cialized applications. The option value specifies the last few
letters of the name of a pseudo-terminal to use in slave mode,
plus the number of the inherited file descriptor. If the
option contains a "/" character, that delimits the characters
used for the pseudo-terminal name from the file descriptor.
Otherwise, exactly two characters are used from the option for
the pseudo-terminal name, the remainder is the file descriptor.
Examples (the first two are equivalent since the descriptor
follows the last "/"):
-S/dev/pts/123/45
-S123/45
-Sab34
Note that xterm does not close any file descriptor which it did
not open for its own use. It is possible (though probably not
portable) to have an application which passes an open file
descriptor down to xterm past the initialization or the -S
option to a process running in the xterm.
Hier ein Screenshot zeigt, ditto
:
Ja, aber ich frage mich, wie Flüche Daten Ausgang zu fangen, ich weiß nicht, wie es zu tun. –
Sie sollten nicht, da Flüche direkten Schreibzugriff auf die tty erwarten.Sie können wahrscheinlich den Dateideskriptor an der Stelle 1 hintergehen und ersetzen, nachdem Flüche mit etwas anderem initialisiert wurden, wie eine Pipe –
Sie können 'newterm' anstelle von' initscr' verwenden, um Flüche mit einem anderen Terminal als stdin/stdout zu initialisieren. Sie können es sogar mehrmals aufrufen, um mehrere Terminals zu verwalten. –