Superkkt Blog

static struct termios stored_settings;

static void
echo_off(void)
{
   struct termios new_settings;
   
   /* 기존 설정 저장 */
   tcgetattr(0, &stored_settings);
   new_settings = stored_settings;
   
   /* 최소 입력문자 1, 반향 제거, 비정규입력 모드
    * 최소 입력문자를 1로 설정하지 않으면 비정규모드
    * 에서도 최소 네글자를 타이핑해야 getc() 같은
    * 함수에서 리턴이 된다.
    */
   new_settings.c_cc[VMIN] = 1;
   new_settings.c_lflag &= (~ECHO);
   new_settings.c_lflag &= (~ICANON);
   tcsetattr(0, TCSANOW, &new_settings);
}


static void
echo_on(void)
{
   /* 기존 설정 복구 */
   tcsetattr(0, TCSANOW, &stored_settings);
}

터미널 설정을 조정해서 비정규(non-canonical) 모드로 전환하면 된다. 정규모드(기본값)에서는 사용자 입력을 받을때 버퍼에 미리 받았다가 사용자가 엔터를 입력해야지만 입력값을 돌려준다. 그래서 사용자가 백스페이스를 사용해서 입력했던 내용을 지울 수도 있다.

하지만 비정규모드에서는 ERASE, KILL, EOF, NL, CR 등을 사용할 수 없다. 이들도 하나의 입력된 문자로 처리될 뿐이다.

단, 주의할점이 패스워드 입력을 위해 반향을 끄고 비정규모드로 돌렸다고 하더라도 최소 입력 문자수를 1로 설정하지 않으면 getc() 같은 함수에서 최소 네글자를 입력해야 리턴이 된다.

2006/03/27 21:47 2006/03/27 21:47

trackbacks

trackbacks rss

이 글에는 트랙백을 보낼 수 없습니다

Leave a Comment