리눅스상에서 콘솔을 통해 키를 입력받을때, Return키를 입력받지 않고 키 값에 반응해 실시간(?)으로 처리되는 작업이 필요할때가 있다. 헌데 리눅스에서는 윈도우처럼 getch함수가 존재하지 않기 때문에 이를 따로 구현해줘야 하는데, 아래는 리눅스 상에서 getch() 함수를 구현한 예이다.

  1. #include <stdio.h>  
  2. #include <term.h>  
  3. #include <termios.h>  
  4. #include <unistd.h>  
  5.   
  6. int getch(void)  
  7. {  
  8.   int ch;  
  9.   struct termios buf;  
  10.   struct termios save;  
  11.   
  12.    tcgetattr(0, &save);  
  13.    buf = save;  
  14.    buf.c_lflag &= ~(ICANON|ECHO);  
  15.    buf.c_cc[VMIN] = 1;  
  16.    buf.c_cc[VTIME] = 0;  
  17.    tcsetattr(0, TCSAFLUSH, &buf);  
  18.    ch = getchar();  
  19.    tcsetattr(0, TCSAFLUSH, &save);  
  20.    return ch;  
  21. }  
  22.   
  23. int main(void)  
  24. {  
  25.     int ch;  
  26.   
  27.     for(; !(ch=='\n');){  
  28.   
  29.         ch = getch();  
  30.         printf("%d \n", ch);  
  31.     }  
  32.   
  33.     return 0;  
  34. }  

터미널로부터 리턴키가 입력될때까지 자료를 입력받는 예제

위의 예제를 보다 발전(?)시키기 위해서 좀더 많은 자료가 필요하다면, 아래의 링크를 참조하기 바란다. 터미널을 제어하는 방법에 대한 내용이 자세하게 정리되어 있는 페이지이다.
링크 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/article/termios


◆ 추가로 터미널 입력시 특수문자를 요약한 Table

Figure 18.9. Summary of special terminal input characters

Character

Description

c_ccsubscript

Enabled by

Typical value

POSIX.1

FreeBSD 5.2.1

Linux 2.4.22

Mac OS X 10.3

Solaris 9

   

field

flag

      

CR

carriage return

(can't change)

c_lflag

ICANON

\r

DISCARD

discard output

VDISCARD

c_lflag

IEXTEN

^O

 

DSUSP

delayed suspend (SIGTSTP)

VDSUSP

c_lflag

ISIG

^Y

 

 

EOF

end of file

VEOF

c_lflag

ICANON

^D

EOL

end of line

VEOL

c_lflag

ICANON

 

EOL2

alternate end of line

VEOL2

c_lflag

ICANON

   

ERASE

backspace one character

VERASE

c_lflag

ICANON

^H, ^?

ERASE2

alternate backspace character

VERASE2

c_lflag

ICANON

^H, ^?

 

     

INTR

interrupt signal (SIGINT)

VINTR

c_lflag

ISIG

^?, ^C

KILL

erase line

VKILL

c_lflag

ICANON

^U

LNEXT

literal next

VLNEXT

c_lflag

IEXTEN

^V

 

NL

line feed (newline)

(can't change)

c_lflag

ICANON

\n

QUIT

quit signal (SIGQUIT)

VQUIT

c_lflag

ISIG

^\

REPRINT

reprint all input

VREPRINT

c_lflag

ICANON

^R

 

START

resume output

VSTART

c_iflag

IXON/IXOFF

^Q

STATUS

status request

VSTATUS

c_lflag

ICANON

^T

 

 

 

STOP

stop output

VSTOP

c_iflag

IXON/IXOFF

^S

SUSP

suspend signal (SIGTSTP)

VSUSP

c_lflag

ISIG

^Z

WERASE

backspace one word

VWERASE

c_lflag

ICANON

^W

 

출처 : http://codeidol.com/%5B~MODULE~%5D/advanced-programming-in-unix/Terminal-I-O/-18.3.-Special-Input-Characters/

+ Recent posts