C / Linux / kbhit()

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
osculumobscenum
Beiträge: 25
Registriert: Do Okt 31, 2013 9:03 pm

C / Linux / kbhit()

Beitrag von osculumobscenum » Do Apr 21, 2022 7:28 pm

Hallo zusammen,
seit kurzem beschäftige ich mich ein bisschen mit C, weil ich nach ca. 15-jähriger Recherche festgestellt habe, dass unter meinem Betriebssystem (Linux) C einfach mehr die Heimat abbildet als Pascal, was ich eigentlich aus meiner Jugendzeit her kenne. Wohlgemerkt beschränke ich mich bei alldem auch auf Konsolenprogramme, keine GUI's.
Dann auch gleich zu meinem Problem : wenn ich also in C (wie gesagt unter Linux) eine Schleife realisieren will, die solange geht, bis ich eine Taste drücke, dann scheint es dafür keine native Möglichkeit zu geben, soweit ich sehe ?!? die "kbhit()"-Funktion ist unter Linux wohl nicht implementiert, alles was ich dazu gelesen habe besagt, dass man wohl am besten direkt am INT 16h nachhakt, ob eine Taste gedrückt ist.

Ist das wirklich so, und wenn ja, ist es überhaupt empfehlenswert diese Brechstangenmethode mit dem INT 16h zu realisieren, oder stellt das eher einen hässlichen Eingriff ins Betriebssystem dar?

Das ganze will ich mit Debian und GCC machen.

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: C / Linux / kbhit()

Beitrag von nufan » Fr Apr 22, 2022 10:49 am

Hallo :)

Den Interrupt musste ich erst recherchieren, klingt für mich aber nach keiner guten Lösung. Falls du das Programm nur abbrechen möchtest, könntest du einfach Strg+C verwenden und bei Bedarf das Signal behandeln. Möchtest du das Programm tatsächlich steuern, wäre die ncurses-Bibliothek eine saubere aber ebenso aufwendige Lösung. Möglicherweise kannst du das Problem auch lösen, indem du die Schleife und die Eingabe in verschiedene Threads packst.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C / Linux / kbhit()

Beitrag von Xin » Sa Apr 23, 2022 6:47 pm

osculumobscenum hat geschrieben:
Do Apr 21, 2022 7:28 pm
Hallo zusammen,
seit kurzem beschäftige ich mich ein bisschen mit C, weil ich nach ca. 15-jähriger Recherche festgestellt habe, dass unter meinem Betriebssystem (Linux) C einfach mehr die Heimat abbildet als Pascal, was ich eigentlich aus meiner Jugendzeit her kenne.
C ist im Prinzip das gleiche wie Pascal. Weniger restriktiv, weniger prosaisch, halt etwas direkter auf den Punkt.
C ist relativ einfach von einem System auf ein anderes zu bringen, weil es quasi nichts kann. Du holst Dir Funktionalität über Libs rein.
osculumobscenum hat geschrieben:
Do Apr 21, 2022 7:28 pm
Dann auch gleich zu meinem Problem : wenn ich also in C (wie gesagt unter Linux) eine Schleife realisieren will, die solange geht, bis ich eine Taste drücke, dann scheint es dafür keine native Möglichkeit zu geben, soweit ich sehe ?!?
Exakt.
C setzt keine Konsole voraus, wo jemand eine Taste drücken könnte.
osculumobscenum hat geschrieben:
Do Apr 21, 2022 7:28 pm
die "kbhit()"-Funktion ist unter Linux wohl nicht implementiert, alles was ich dazu gelesen habe besagt, dass man wohl am besten direkt am INT 16h nachhakt, ob eine Taste gedrückt ist.

Ist das wirklich so, und wenn ja, ist es überhaupt empfehlenswert diese Brechstangenmethode mit dem INT 16h zu realisieren, oder stellt das eher einen hässlichen Eingriff ins Betriebssystem dar?
Das ist quasi die Brechstange, aber die Interrupts werden von Linux bearbeitet. Ich gebe mit meinen Programmen teilweise auch auch Text aus.

Weniger Brechstange wäre NCurses. In dieser Lib sind entsprechende vorhanden.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

osculumobscenum
Beiträge: 25
Registriert: Do Okt 31, 2013 9:03 pm

Re: C / Linux / kbhit()

Beitrag von osculumobscenum » Mo Apr 25, 2022 7:46 pm

Mir scheint, der Ansatz mit den verschiedenen Threads könnte der edelste sein. Für mich als Nichtprofi bedeutet das natürlich einen gewissen Zeitaufwand, bis ich mich da reingelernt habe... aber ich das teste ich bei Gelegenheit mal! :-)

Antworten