"non blocking console input" wieder rückgängig machen? [Beitrag #2969] |
Mo, 21 Oktober 2019 17:14 |
|
jmar83
Beiträge: 18 Registriert: Juni 2017
|
Junior Member |
|
|
Hallo zusammen
Folgender Java-Code liegt mir vor:
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.security.auth.login.Configuration;
public class TerminalUtil {
private static String ttyConfig;
public static void setTerminalToCBreak() throws IOException, InterruptedException {
TerminalUtil.ttyConfig = TerminalUtil.stty("-g");
// TerminalUtil.stty("-icanon min 1");
TerminalUtil.stty("-icanon min 1 -icrnl -inlcr -ixon");
TerminalUtil.stty("-echo");
TerminalUtil.stty("-cooked");
}
public static String getTTYConfig() {
return TerminalUtil.ttyConfig;
}
public static String stty(final String args) throws IOException, InterruptedException {
final String cmd = "stty " + args + " < /dev/tty";
return TerminalUtil.exec(new String[] { "sh", "-c", cmd });
}
private static String exec(final String[] cmd) throws IOException, InterruptedException {
final ByteArrayOutputStream bout = new ByteArrayOutputStream();
final Process p = Runtime.getRuntime().exec(cmd);
int c = 0;
InputStream in = p.getInputStream();
while ((c = in.read()) != -1) {
bout.write(c);
}
in = p.getErrorStream();
while ((c = in.read()) != -1) {
bout.write(c);
}
p.waitFor();
final String result = new String(bout.toByteArray());
return result;
}
}
( https://github.com/Robo-HUB/robo-hub/blob/master/robo-hub-ev 3/ev3/src/de/hu_berlin/informatik/ev3/sim/KeyConsole.java)
...nun ist aber so, dass wenn ich ein Abbruchkriterium habe (break z.B. bei `#` im while(true) in der main-Funktion), dass sich dann die Konsole nicht mehr richtig "regneriert".
Dann kommt das dabei raus:
jmar83@debian-martij-dev:~$ java -jar '/home/jmar83/Desktop/Eclipse Workspaces/Java/ConsoleTest/ci.jar'
-
-
-
-
-
-
-
-
-
-
-
-
Anwendung wird beendet
jmar83@debian-martij-dev:~$ jmar83@debian-martij-dev:~$ jmar83@debian-martij-dev:~$ jmar83@debian-martij-dev:~$ jmar83@debian-martij-dev:~$ jmar83@debian-martij-dev:~$ jmar83@debian-martij-dev:~$ jmar83@debian-martij-dev:~$ jmar83@debian-martij-dev:~$ jmar83@debian-martij-dev:~$ jmar83@debian-martij-dev:~$ jmar83@debian-martij-dev:~$ jmar83@debian-martij-dev:~$
Irgendwie scheint es halt eben doch nicht so gut zu klappen wie hier beschrieben: https://www.darkcoding.net/software/non-blocking-console-io- is-not-possible/
Jedes mal, wenn ich nach dem Beenden die Enter-Taste drücke, ist wieder ein neuer `jmar83@debian-martij-dev:~$`-Eintrag drin...(?)
Und `-icanon min 1 -icrnl -inlcr -ixon` vs. `-icanon min 1"` macht NULL unterschied - es heisst, dass etwa `icrnl` bei FreeBSD nicht unterstützt wird: https://github.com/jline/jline2/blob/master/src/main/java/jl ine/UnixTerminal.java
Frage: Kennt sich jemand mit diesem (alles andere als alltäglichen) Thema aus? Bin für jegliche Inputs dankbar.
Grüsse, Jan
|
|
|
|
|