Daha önce de belirtildiği gibi, sigaction
ctrl-c'yi select
yakalamak veya herhangi bir standart girişi yakalamak için kullanabilirsiniz.
Bununla birlikte, ikinci yöntemle, TTY'yi bir defada satır modu yerine bir defada karakter modunda olacak şekilde ayarlamanız gerektiğini unutmayın. İkincisi varsayılandır - bir metin satırı yazarsanız, siz enter tuşuna basana kadar çalışan programın stdin'ine gönderilmez.
tcsetattr()
ICANON modunu kapatmak için işlevi kullanmanız ve muhtemelen ECHO'yu da devre dışı bırakmanız gerekir. Hafızadan, program çıktığında terminali tekrar ICANON moduna ayarlamanız gerekir!
Tamlık adına, işte biraz önce devreden çıkardığım (nb: hata kontrolü yok!), Bir Unix TTY kuran ve DOS <conio.h>
işlevlerini taklit eden kbhit()
ve 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();
}