Programm auf Tastendruck beenden und vorher noch closef ausführen

ölgötz

ölgötz

Grünschnabel
Hallo,

ich bin neu in der Linux-und C-Programmierung und hab' mir folgendes Progrämmchen gebastelt:

Ein Programm in C, das nach dem Programmstart eine Datei anlegt und dann in einer Endlosschleife den LPT-Port und den seriellen Port abfragt. Wenn auf einem der beiden Ports was passiert, dann wird dieses Ereignis zusammen mit der exakten Zeit in die Datei geschrieben ... daneben passieren noch ein paar andere Dinge, aber die spielen für meine Frage hier gerade keine Rolle ...

Mein Problem ist jetzt, dass ich das Programm derzeit mit Strg+C abbreche. Deswegen komme ich nicht zum closef(), das den Datenfile anständig schreibt und schließt und folgerichtig ist der angelegte File immer leer.

Jetzt könnte ich eine Tastaturabfrage in die Schleife einbauen, um das Programm sauber zu beenden. Aber getchar() geht nicht, weil das Programm an der Stelle stehen bleiben und auf eine Eingabe warten würde. Meine Frage daher: Gibt es irgend eine andere Möglichkeit, eine Tastatureingabe nur dann abzufangen, wenn tatsächlich eine bestimmte Taste gedrückt wird und wenn keine gedrückt wird, läuft das Programm einfach weiter ?

... Ich vermute, dass ich, wenn ich eine GUI verwenden würde, ich wahrscheinlich Funktionen zur Verfügung gestellt bekommen würde, die die Tastaturereognisse abfangen würden, mir genügt aber vorerst das Arbeiten und die Bildschirmausgabe mit der bash - deswegen suche ich eine Lösung, die ohne QT oder ähnlichem auskommt.

Kann mir da jemand einen Tipp geben?

PS: Ich hab' gerade gemerkt, dass sich das Problem mit der leeren Datei relativ einfach lösen lästt, wenn man von Zeit zu Zeit fflush(); aufruft ... An der Frage nach dem Abfangen der Tastaturereignisse wäre ich aber weiterhin interessiert ...

Viele Grüße,
Ö
 
Zuletzt bearbeitet:
Entweder du lagerst die blockierenden Sachen in einen extra Thread aus und wartest im Hauptthread auf den Tastendruck oder du fängst SIGINT(ctrl-c) mit signal() ab und führst dann im Handler closef() usw aus.(wahrscheinlich einfacher, da du dich nicht um die Kommunikation usw. zwischen den Threads kümmern musst)
 
Zuletzt bearbeitet:
Soweit ich weiß, gibt's kbhit() nicht standardmäßig unter GNU/Linux. Es gibt zwar eine Entsprechung bei der ncurses-Bibliothek, deren Anwendung für dieses Problem aber m.E. übertrieben wäre. kbhit() könntest du dir allerdings auch selbst schreiben: http://my.execpc.com/~geezer/software/kbhit.c(Nicht getestet)
 
Zuletzt bearbeitet:
Hallo, Lesco & JBR,

toll, dass ihr so schnell geantwortet habt. Ich werde die beiden Möglichkeiten mal ausprobieren und hier berichten.

Gruss,
Ö
 

Ähnliche Themen

[HowTo] TeamSpeak 2 - RC2 - Server (Deutsch/Englisch)

Zurück
Oben