?
Interessanterweise spielt es gar keine so große Rolle, dass du bei jedem Schleifendurchlauf wieder die Terminal-Settings zweimal veränderst; das eigentliche Problem ist getchar(), welches scheinbar eine Weile auf Daten wartet.
Wir bewegen uns hier eh abseits des C++-Standards, also greife ich mal in die POSIX-Kiste: fcntl und read sind dein Freund für non-blocking IO. Ich stelle mir das etwa so vor:
#include <cstdio>
#include <iostream>
#include <limits>
#include <tr1/cstdint>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
int main() {
// Terminal-Settings so verändern, dass die Eingabe ungepuffert und ohne
// Echo erfolgt:
struct termios ts_old, ts_new;
tcgetattr(STDIN_FILENO, &ts_old);
ts_new = ts_old;
ts_new.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &ts_new);
// Stdin auf non-blocking setzen
int stdin_flags = fcntl(STDIN_FILENO, F_GETFL);
fcntl(STDIN_FILENO, F_SETFL, stdin_flags | O_NONBLOCK);
for(std::tr1::uint64_t i = 1; i > 0; ++i) {
char c;
if(read(STDIN_FILENO, &c, 1) == 1 && c == 'c') {
std::cout << "i: " << i << std::endl;
}
}
// Hinterher aufräumen. In Produktionscode sollte das natürlich per RAII
// gemacht werden.
fcntl(STDIN_FILENO, F_SETFL, stdin_flags);
tcsetattr(STDIN_FILENO, TCSANOW, &ts_old);
return 0;
}
Es wird trotzdem ewig dauern, bis ein uint64_t überläuft. Das kann ich aber auch nicht ändern.
Was Ctrl-C angeht: dass das nicht funktioniert, wird daran liegen, dass du hier:
term.c_lflag = term.c_lflag & (!ICANON);
c_lflag völlig ausradierst, weil du den Binärkomplement-Operator mit dem logischen Nicht-Operator verwechselst. Dabei wird auch ISIG auf 0 gesetzt, und dementsprechend generiert Ctrl-C kein SIGINT mehr.