Ich habe einen psuedo Terminal auf Linux C ausgeführt wird, geöffnet, wie gezeigt:Verwenden von Termios(), um EOF zu ersetzen?
else
{
struct termios slave_orig_term_settings; // Saved terminal settings
struct termios new_term_settings; // Current terminal settings
// CHILD
close(fdm);
rc = tcgetattr(fds, &slave_orig_term_settings);
new_term_settings = slave_orig_term_settings;
new_term_settings.c_cc[VEOF] = '|';
new_term_settings.c_oflag &= ~(ICANON | ECHO | ECHOE | ECHOK | ECHONL | ISIG | ICRNL);
cfmakeraw (&new_term_settings);
tcsetattr (fds, TCSANOW, &new_term_settings);
}
Wenn aus dem Rohr zu lesen, kann ich ein nicht blockierende machen read(), die nach der Rückkehr werden, beispielsweise 5 Sekunden. Das Problem ist, dass wenn ich einen Befehl wie "ls" ausführe, der in mehreren ms zurückkehrt, wird er die vollen 5 Sekunden warten, bevor er zurückkehrt.
Ich verstehe, mit einem physischen GUI-Terminal, und nicht ein Pseudo-Terminal wie folgt, kann der Benutzer STRG drücken^D und EOF am Ende jeder Ausgabe gesendet haben.
Ich möchte diesen Effekt, so kann mein Programm sagen: "OK, ich habe dieses bestimmte Byte empfangen, was bedeutet, dass das Terminal fertig ist, auszugeben, und ich kann diese Ausgabe jetzt zurück zum Anrufer bringen, und ich weiß, dass es keine gibt mehr Ausgabe zum Lesen ".
Ich verstehe, dass dies mit der Funktion termios() getan wird (oder es ist Wrapper stty), aber ich kann es nicht funktionieren. Ich möchte, dass das Terminal mir das '|' char anstelle von ctrl^d (\ x04) nach Beendigung der Ausgabe, aber es funktioniert nicht.
Aus Gründen der Klarheit, nach Abschluss der Ausgabe (über read()), möchte ich das '|' Byte. Also, wenn ich ‚pwd‘ Befehl senden, erhalte ich diese Ausgabe:
$ pwd
/home/user/dir
$|
Könnte jemand bitte sagen Sie mir, wie man diesen Code bearbeiten, um diesen Effekt zu acheive?
Danke für Ihre Hilfe.
EDIT - select() Code
while ((bytes = select(pipe + 1, &fd_in, NULL, NULL, &tv)))
{
if (FD_ISSET(pipe, &fd_in))
{
read (pipe...)
Das Verhalten des obigen Code ist, wie ich beschrieben habe, für den vollen Wert von tv zu warten, auch wenn es nichts auf dem Rohr ist, vor der Rückkehr .
Die '.c_cc [VEOF]' Sonderzeichen nur in "kanonischen" -Modus ('ICANON' in' .c_lflags' Bit gesetzt) verwendet wird, aber 'cfmakeraw' "raw" -Modus setzt (' ICANON' Bit nicht eingestellt). –