Ich habe eine kleine App geschrieben in C entwickelt, um auf Linux zu laufen. Ein Teil der App akzeptiert Benutzereingaben über die Tastatur und verwendet den nicht-kanonischen Terminalmodus, so dass er auf jeden Tastenanschlag reagieren kann.Linux Terminal Problem mit nicht-Canonical Terminal I/O App
der Abschnitt des Codes, den Eingang akzeptiert ist eine einfache Funktion, die wiederholt in einer Schleife aufgerufen wird:
char get_input()
{
char c = 0;
int res = read(input_terminal, &c, 1);
if (res == 0) return 0;
if (res == -1) { /* snip error handling */ }
return c;
}
Dies liest ein einzelnes Zeichen vom Terminal. Wenn innerhalb eines bestimmten Zeitraums keine Eingabe empfangen wird (angegeben durch den Wert c_cc [VTIME] in der termios-Struktur), gibt read() 0 zurück, und get_input() wird erneut aufgerufen.
Das funktioniert alles gut, außer ich vor kurzem festgestellt, dass wenn Sie diese App in einem Terminalfenster ausführen, und schließen Sie das Terminalfenster, ohne die App zu beenden, die App nicht beendet, sondern startet in eine CPU intensive Endlosschleife read() gibt kontinuierlich 0 zurück, ohne zu warten.
Wie kann ich die App ordnungsgemäß beenden lassen, wenn sie von einem Terminalfenster ausgeführt wird und das Terminalfenster geschlossen wird? Das Problem ist, dass read() niemals -1 zurückgibt, so dass die Fehlerbedingung nicht von einem normalen Fall unterscheidbar ist, in dem read() 0 zurückgibt. Die einzige Lösung, die ich sehe, ist einen Timer einzufügen und anzunehmen, dass ein Fehler vorliegt read gibt 0 schneller als die in c_cc [V_TIME] angegebene Zeit zurück. Aber diese Lösung scheint bestenfalls hacky zu sein, und ich hoffte, dass es einen besseren Weg gibt, mit dieser Situation umzugehen.
Irgendwelche Ideen oder Vorschläge?