, ungetc(), fgetc() , , fgetc() stdin select().
. , ( Enter).
, , () , tcsetattr() termios. fgetc(), , ungetc().
void handler(int sig) {
ungetc('A', stdin);
}
void wait_for_stdin() {
fd_set fdset;
FD_ZERO(&fdset);
FD_SET(fileno(stdin),&fdset);
select(1, &fdset, NULL, NULL, NULL);
}
void foo () {
int key;
struct termios terminal_settings;
signal(SIGUSR1, handler);
tcgetattr(fileno(stdin), &terminal_settings);
terminal_settings.c_lflag &= ~(ECHO|ICANON);
terminal_settings.c_cc[VTIME] = 0;
terminal_settings.c_cc[VMIN] = 0;
tcsetattr(fileno(stdin), TCSANOW, &terminal_settings);
for (;;) {
wait_for_stdin();
key = fgetc(stdin);
if (key == 0x04) {
break;
}
if (key != EOF) {
printf("%c\n", key);
}
}
}
. .
ECHO ICANON - . VTIME VMIN c_cc (fgetc()) , ; stdin. , key EOF, . stdin , stdin, select().
, SIGUSR1
t e s t 1:
A
t
e
s
t
1), Linux