Ctrl-c abfangen
-
Hallo!
Ich bin recht neu in c++, deswegen diese möglicherweise triviale Frage:
Ich möchte für ein in der Shell laufendes die Ctrl-C - Eingabe abfangen. Falls jemand Ctrl-C drückt, möchte ich zuerst eine Funktion abarbeiten, und dann erst das Programm beenden.
Wie muß ich das angehen?
Mitsch
-
Nun so trivial ist das garnichtmal - Du musst eine Signalbehandlungsroutine installieren, in der Du dann Deinen Ablauf niederlegst. Zusätzlich sollten Signalbehandlungsroutinnen möglichst kurze Ausführungszeiten haben. Das Signal für STRG-C ist SIGINT.
Zum Glück geht das (jedenfalls laut meiner Visual C++ 6 Doku) unter UNIX wie unter Windows:
void handler(int signum) { cout << "Du hast STRG-C gedrückt?! Wahnsinn!" << endl; exit(1); // sonst würde er unbeeindruckt in das laufende Programm zurückspringen } /* ... */ signal(SIGINT, handler);
Du kannst natürlich auch eine globale Variable setzen die dem Hauptprogramm signalisiert dass das Programm sich nun beenden soll oder ähnlich.
EDIT:
Aber mit Standard-C++ hat das nicht viel zu tun
-
Kann man so nicht sagen @LordJaxom und Standard C++.
Immerhin sieht der Standard vor, dass nur eine Variable vom Typ volatile sig_atomic_t innerhalb eines Signals (wird so im Standard erwähnt) geschrieben werden und danach vom laufenden Programm wieder ausgewertet werden darf. Genaues Kapitel ist mir gerade entfallen, kann ich aber nachschauen, falls akuter Bedarf besteht.
Die Funktion signal() ist natürlich UNIX-spezifisch. Man sollte übrigens besser sigaction nehmen (manpage hilft da weiter).
EDIT: Wie - VS6 sieht signal auf für Windows vor?
Ist mir neu. (Soll nicht heißen, dass deine Aussage falsch ist - überrascht mich nur)
-
Dass man solche Flagvariablen volatile deklarieren sollte wusste ich, nur nicht dass dies sogar im Standard steht
sig_atomic_t kannte ich noch nicht.
Und signal() ist auch unter VS2005 noch in der Standard-C-Runtime enthalten, jedenfalls laut MSDN (in signal.h)
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Siehe:
SetConsoleCtrlHandler