Як уже зазначалося, ви можете використовувати sigaction
для захоплення ctrl-c або select
для захоплення будь-якого стандартного введення.
Однак зауважте, що з останнім методом вам також потрібно встановити TTY таким чином, щоб він знаходився в режимі "символ за раз", а не "за часом". Останнє є типовим - якщо ви вводите рядок тексту, він не надсилається на stdin запущеної програми, поки ви не натиснете Enter.
Вам потрібно буде використовувати tcsetattr()
функцією, щоб вимкнути режим ICANON і, можливо, також вимкнути ECHO. З пам'яті вам також доведеться перевести термінал у режим ICANON, коли програма виходить!
Просто для повноти картини , ось код , який я тільки що залетіла (нб: немає перевірки помилок) , який встановлює Unix TTY і емулює DOS <conio.h>
функції kbhit()
і getch()
:
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/select.h>
#include <termios.h>
struct termios orig_termios;
void reset_terminal_mode()
{
tcsetattr(0, TCSANOW, &orig_termios);
}
void set_conio_terminal_mode()
{
struct termios new_termios;
tcgetattr(0, &orig_termios);
memcpy(&new_termios, &orig_termios, sizeof(new_termios));
atexit(reset_terminal_mode);
cfmakeraw(&new_termios);
tcsetattr(0, TCSANOW, &new_termios);
}
int kbhit()
{
struct timeval tv = { 0L, 0L };
fd_set fds;
FD_ZERO(&fds);
FD_SET(0, &fds);
return select(1, &fds, NULL, NULL, &tv);
}
int getch()
{
int r;
unsigned char c;
if ((r = read(0, &c, sizeof(c))) < 0) {
return r;
} else {
return c;
}
}
int main(int argc, char *argv[])
{
set_conio_terminal_mode();
while (!kbhit()) {
}
(void)getch();
}