리눅스 c++ 에서 비동기 키 입력 이벤트 구현

getchar()은 문자가 입력될 때까지 기다리는 동기 방식이기 때문에 비동기 방식의 문자열 입력 기능이 필요하다. 윈도우라면 conio.h 라이브러리에서 kbhit() 을 사용하면 되지만 리눅스에는 없다.

따라서 비동기 키 입력 이벤트를 직접 구현해야 한다.
일본 쪽 사이트에서 나와 있는 가이드를 보고 따라해 구현했다.(http://blog.goo.ne.jp/xmldtp/e/067f5e0ff4efeca546e4458f4d36a619)

char in_char = 0; //입력된 키
char read_byte = 0; //읽어들인 바이트 수
struct termio tty_backup; //변경 전 설정을 보존하는 구조체
struct termio tty_change; //변경 후 설정을 보존하는 구조체


ioctl(0, TCGETA, &tty_backup); // 현재의 설정을 tty_backup에 저장 - 파일 디스크립터 미지정
tty_change = tty_backup;

(반복문 시작)
tty_change.c_lflag &= ~(ECHO | ICANON); //에코를 무효화 시키고 캐노니얼 입력을 유효화한다.
tty_change.c_cc[VMIN] = 0;
tty_change.c_cc[VTIME] = 1;
ioctl(0, TCSETAF, &tty_change); //변경한 설정을 반영한다

if( 0 < read(0, &in_char, 1)) return -1;
switch(in_char)
{
    case 0x0a: //엔터 입력시
    ioctl(0, TCSETAF, &tty_backup); //원래 설정으로 되돌리고
    // *** 키 입력시 원하는 이벤트를 기입하자 ***//
    memset(&in_char, 0, sizeof(in_char));
    default:
    putchar(in_char);
    fflush(NULL);
}
        
 ioctl(0, TCSETAF, &tty_backup);
(반복문 끝)

댓글