signal abfangen
-
Hallo,
ich suche eine möglichkeit !alle! tastatursignal abzufangen, die ein konsolenorientietes programm zum abbruch gingen kann.
momentan fange ich strg-c ab:signal(SIGINT,signalHandler); ... void signalHandler(int signal) { if (signal == SIGINT) { ... } else { ... } }
aber was ist mit strg-d oder strg-z
Ich komme nicht weiter ...gruss david
-
Plattform?
Unter Linux/UNIX kannst Du noch TERM (terminierung von aussen), HUP (Elternprozess hat sich beendet) und ein paar andere abfangen. Das sind aber keine Tastatursignale.
Strg-D unter Linux/UNIX (bzw., so glaube ich, auch Strg-Z unter Windows) ist aber kein Signal an das Programm, sondern an das Terminal, dass es stdin des Prozesses schließen soll. Dieses "Signal" kannst Du IMHO nur abfangen indem Du schaust ob stdin den Zustand EOF hat.
-
GNU/Linux
mein prog besitzt einen keyboard thread, der evtl. steuermöglichkeiten dem prog gib - hier wäre die abfrage ja unnötig, da das terminal die stdin verwaltet, richtig??? Mir ist unklar wie es weiter gehen soll?!?!
-
Das Terminal verwaltet zwar stdin (bzw. verbindet das Gerät "Tastatur" mit dem Subprozess, welcher Dein Programm ist), aber auf Zustandsänderungen musst Du immernoch selbst reagieren.
Naja, wenn Du einen Keyboard-Thread hast, wirst Du dort doch irgendwo eine Schleife haben, die regelmäßig Tastatureingaben liest, oder? Wenn hier das Lesen schiefgeht, kannst Du mittels feof (o.ä.) den Zustand abfragen (wenn Du C++-Streams benutzt, analog cin.eof()).
while (fgets(zeile, sizeof(zeile), stdin) != NULL) { // Zeile gelesen ... } if (feof(stdin)) { // Schleife wurde beendet, weil User STRG-D gedrückt hat } else { // Schleife wurde durch "echten" Fehler beendet }
Oder missverstehe ich die Frage?
-
nein, soweit so gut. aber jetzt habe ich das Problem,
das wenn ich zb exit(enter) eingebe um das prog zu be-
enden. nichts passiert. strg-d für dann zu ausführung.
diese soll aber schon bei der eingabetaste passierengruss