출처: http://stackoverflow.com/questions/448944/c-non-blocking-keyboard-input
windows에서 conio.h를 포함하고 _kbhit()함수를 사용하여 키보드 이벤트가 발생했는지 여부를 알 수 있는데 리눅스에서는 해당하는 함수가 없어서 검색해봄.
#ifndef WIN32
int _kbhit()
{
struct timeval tv = { 0L, 0L };
fd_set fds;
FD_ZERO(&fds);
FD_SET(0, &fds);
return select(1, &fds, NULL, NULL, &tv);
}
#endif
위의 소스로 안되는 경우가 있어서 좀 더 찾아보니 다음과 같은 것들도 있다.
출처는 linux kbhit 오픈 소스라는데... 까먹음 ;;
static struct termios initial_settings, new_settings;
static int peek_character = -1;
void init_keyboard()
{
tcgetattr(0,&initial_settings);
new_settings = initial_settings;
new_settings.c_lflag &= ~ICANON;
new_settings.c_lflag &= ~ECHO;
new_settings.c_cc[VMIN] = 1;
new_settings.c_cc[VTIME] = 0;
tcsetattr(0, TCSANOW, &new_settings);
}
void close_keyboard()
{
tcsetattr(0, TCSANOW, &initial_settings);
}
int _kbhit()
{
unsigned char ch;
int nread;
if (peek_character != -1) return 1;
new_settings.c_cc[VMIN]=0;
tcsetattr(0, TCSANOW, &new_settings);
nread = read(0,&ch,1);
new_settings.c_cc[VMIN]=1;
tcsetattr(0, TCSANOW, &new_settings);
if(nread == 1)
{
peek_character = ch;
return 1;
}
return 0;
}
int _getch()
{
char ch;
if(peek_character != -1)
{
ch = peek_character;
peek_character = -1;
return ch;
}
read(0,&ch,1);
return ch;
}
int _putch(int c) {
putchar(c);
fflush(stdout);
return c;
}
사용법
init_keyboard();
while (1) {
if (_kbhit()) {
int ch = _getch();
_putch(ch);
switch (ch) {
...
}
}
}
close_keyboard();
putch를 해주는 이유는 _getch호출 시 화면에 출력하지 않고 바로 input buffer에서 읽어오기 때문에 사용자에게 보여주기 위해 출력해줌.
'develop > linux' 카테고리의 다른 글
TTFB 체크 명령어 (0) | 2016.02.16 |
---|---|
GNU C, __attribute__ (0) | 2014.10.14 |
NAT 종류별 설정 (0) | 2014.02.17 |
Linux TCP/IP tunning (0) | 2014.01.08 |
Ubuntu에서 Oracle java 설치 (0) | 2013.12.31 |