[OS]/Embedded&Linux

termios

하늘을닮은호수M 2007. 9. 27. 17:36
반응형
webdizen | 2007년 05월 14일 10시 37분 | Programming/UNIX C Language | view 141
이번 기사는 termios 관련 함수모음을 이용한 터미널제어에 관한 내용을 다루며, 그중에서도 쉽게 접할수 있는 키보드+모니터쌍으로 구성된 터미널관련 내용을 다룬다.

1절. 터미널
1.1절. 터미널이란 무엇인가 ?
1.2절. 터미널의 종류
1.2.1절. Text Terminal
1.2.2절. Window (Terminal ?)& Thin Clients
2절. 터미널 제어
2.1절. 터미널 제어가 왜 필요한가 ?
2.2절. 터미널 장치 파일(tty)
2.3절. termios 함수를 통한 터미널제어
2.3.1절. 터미널 기본모드
2.3.1.1절. Canonical Mode Input Processing
2.3.1.2절. NonCanonical Mode Input Processing
2.3.2절. termios 구조체 - 터미널 속성구조체
2.3.3절. 터미널 속성 얻어오기
2.3.4절. 터미널 속성 설정
2.3.5절. 몇가지 예제들
2.3.6절. 터미널 검사하기
2.3.7절. 터미널 윈도우 사이즈
2.3.8절. stty 명령어
3절. 결론

--------------------------------------------------------------------------------

1절. 터미널
1.1절. 터미널이란 무엇인가 ?
터미널(terminal) 은 모니터(moniter)와 키보드(keyboard)의 조합으로 지역적으로 붙어있거나 혹은 원격으로 연결된 컴퓨터와 대화하기 위해서 사용되며, 장치의 개념으로 이해할수 있다. 프로그래머는 프로그램을 실행시키기 위해서 키보드를 이용해서 명령을 실행시키며, 그 결과는 모니터를 통해서 출력된다. 우리는 터미널이 없이는 컴퓨터를 효과적으로 다룰수 없을것이다. - 모니터+키보드 대신에 천공테이프를 통해서 명령을 실행시키고, 그 결과를 라인프린터를 통해서 출력받는 다고 가정해보라 -

유닉스 시스템은 기본적으로 text 터미널을 사용하고 있다. 이 텍스트 터미널은 1970 년대 메인프레임(mainframe) 컴퓨터와 통신하기 위해서 사용했었는데, 프로그래머는 전용 장치 (모니터와 키보드가 연결된)를 케이블로 메인프레임과 연결시킨후 프로그래밍작업을 하거나, 문서를 만들고, 시스템을 관리하는 일을 했다.

지금은 터미널장치와 소프트웨어에 많은 발전이 이루어져서, 그당시와는 비교할수 없는 편리한 환경에서 작업을 할수 있다. 만약 여러분이 리눅스를 사용하고 있다면 (X Windows가 아닌) 아마도 여러가지 작업을 위해서 키보드와 모니터 - 터미널 - 를 이용하고 있을것이다. 또한 CTRL+ALT+F1 ... F6 키를 이용하면 여러개의 가상 터미널을 만들어서 가상 터미널 상을 오가면서 동시에 몇개의 다른 작업을 수행할수도 있을것이다.

추가적으로 여러분이 X 윈도우를 사용한다면 터미널을 흉내내는 (emulate) 어플리케이션들을 사용해서, 수십개 이상의 터미널을 띄워서 자유자재로 터미널상을 오가면서 작업을 할수도 있다. 이러한 터미널 emulate 프로그램으로는 xterm, rxvt, zterm 등이 있으며, 한글 입/출력을 지원 기능을 추가한 hanterm 등이 있다. 만약 외형적으로 아주 멋진 터미널 emulate 를 구한다면 Eterm 과 같은 어플리케이션을 사용할수도 있을것이다. 윈도우즈에서는 crt, putty 등의 터미널 emulate 어플리케이션이 존재한다.

현재 우리가 사용하는 개인 PC 는 터미널장치로 키보드와 모니터를 이용하는데, 이들 장치는 각각 그래픽 카드와 PS/2 포트에 연결되어서 사용되어진다. 그러나 위에서 예를든 메인프레임, 라우터 그리고 OS가 내장된 몇가지 소형장비들은 오랜역사를 지니고 있는 serial port(직렬포트) 에 직접 케이블을 연결해서 사용하기도 한다. 라우터에 문제가 생겨서 A/S 직원이 A/S 하는걸 보았다면 아마도 전용 터미널을 serial port (com port) 와 연결해서 작업하는걸 보았을것이다.


--------------------------------------------------------------------------------

1.2절. 터미널의 종류
1.2.1절. Text Terminal
텍스트 터미널은 호스트 컴퓨터와 통신하기 위해서 ASCII 코드를 이용한다. 이러한 ASCII 코드는 보통은 키보드를 통해서 바로 입력이 가능한 문자들이며 모니터를 통해서 바로 출력될수 있다. 그리고 이러한 문자들외에도 몇가지 제어를 위한 문자(Special control byte)들이 존재한다. 이들 제어문자는 커서이동, 삭제 와 같은 입력을 제어하기 위해서 사용된다. 이러한 제어문자는 수백가지 종류가 존재하고 있다. 또한 강조글자(bold) 밑줄문자(underline) 와 색상변경과 같은 출력 모양의 조정을 할수도 있다. 이러한 출력모양 조정을 위해서 ANSI 를 사용한다.

이들 텍스트 터미널은 기본적으로 ASCII 코드만을 통해서 통신을 하기 때문에, 매우저렴하게 전용장치를 개발할수 있으며, 어플리케이션 역시 쉽게 개발가능하다. - 정확히 말하자면 ASCII 256 중에 상위 128 개만을 사용한다 - 386, 286 급 컴퓨터 정도면 충분히 터미널 장치로 사용할수 있을것이며, 만약 휴대성이 중요하다면 액정디스플레이가 달린 매우 조그마한 싸이즈로 만들수도 있을것이며, 실제 라우터 세팅을 위한 전용 장치들이 액정디스플레이와 키보드만을 갖춘 형태로 사용되어지고 있다.


--------------------------------------------------------------------------------

1.2.2절. Window (Terminal ?)& Thin Clients
text 터미널이 아닌것은 Thin Clients(혹은 윈도우 터미널) 라고 말할수 있다. 통신수단으로 그래픽 정보를 사용한다. 이들 Thin Clients 의 경우 전송받은 GUI 화면을 빠른시간에 모니터에 뿌려줄수 있어야 함으로 텍스트 터미널을 구현하기 위한 장치보다 더 비용이 많이든다.

또한 그래픽정보를 전송해야 함으로 텍스트 터미널보다 네트웍 자원을 많이 소모한다.

Thin 클라이언트를 이용 할경우 많은 저장공간과 빠른 연산능력을 가진 중앙컴퓨터를 하나두고, 다른 사용자는 적은 저장공간과 상대적으로 느린 연산능력을 가진 (Thin) 컴퓨터를 두어서 실제 어플리케이션을 사용하거나, 데이타를 이용할때 중앙 컴퓨터에 연결해서 필요한 작업을 하는 컴퓨팅 환경을 만들수 있을것이다.

이럴경우 여러가지 중요 정보가 중앙컴퓨터에 집중되고, 다수의 연결 사용자 컴퓨터에 투자하는 비용을 줄일수 있음으로 정보관리와 비용측면에서 이익을 볼수 있을거라고 생각된다. 그러나 실제로 이러한 컴퓨팅 환경을 만들어서 쓰는 경우는 그리 흔하지 않다. 지역네트웍에 과도한 부하를 유발할수 있고, 중앙 컴퓨터에 문제가 생겼을 경우 모든 작업이 중단될수 있기 때문이다. 거기에 자신의 정보가 자신이 하드에 있지 않고 중앙의 다른 하드에 있다는 것 자체를 많은 직원들이 싫어하는 (믿어워 하지 못하는) 경향이 있기 때문이다.

그래서 주로 원격지의 MS 윈도우즈 계열의 서버를 관리하기 위한 목적으로 많이 쓰인다. VNC 라든지 Windows Terminal Server 가 이러한 어플리케이션이다. 리눅스의 X 윈도우의 경우 C/S 환경으로 만들어져 있기 때문에 기본적으로 Window 터미널로써의 역활을 수행할수 있다.


--------------------------------------------------------------------------------

2절. 터미널 제어
여기에서는 기본적으로 text terminal 을 기준으로 설명하게 될것이며, 테스트를 하기 위한 운영체제는 Linux (Kernel 2.4.x) 가 될것이다. 또한 시리얼통신을 위한 terminal 환경과 같은 것들은 다루지 않을것이다. 이문서에서는 PC에서 가장 일반적으로 사용되는 키보드+모니터 (/dev/tty) 에 대해서만 다룰것이다. 시리얼통신과 같은 특수? 한것들은 역시(-.-;) 기회가 된다면(언젠가) 다루도록 하겠다.


--------------------------------------------------------------------------------

2.1절. 터미널 제어가 왜 필요한가 ?
기본적으로 사용자는 컴퓨터혹은 여러가지 주변장치와 대화할때 터미널을 이용해서 대화하게 된다. 보통 우리가 컴퓨터 모니터 앞에 앉아서 작업을 할때는 표준 터미널장치인 /dev/tty 를 통해서 컴퓨터와 대화를 하겠지만 때때로 직렬(serial)포트를 통해서 컴퓨터와 대화를 해야하는 경우도 생길것이다. 이들 직렬포트와 통신하기 위해서는 /dev/ttyS0 과 같은 장치파일 들을 이용해서 통신을 하게 되는데, 이경우 회선속도를 서로 맞추어줘야 하며, 여러가지 이스케이프문자(Ctrl+C 와 같은)에 대한 처리등을 해주어야 함으로 터미널특성 변경등의 작업을 해주어야 한다. - 이 문서에서는 시리얼 통신과 관련된 주제는 다루지 않을것이다. -

그리고 /dev/tty 를 통해서 작업을 하고자 할때도 키보드 입력을 반향(echo) 시켜야 할것인지, 특수문자입력에 대한 정책수정, 캐리지리턴을 받아들여야 할것인지, Ctrl+d, Ctrl+c 와 같은 제어문자를 받아들일것인지 무시할것인지 등 필요에 따라서 터미널의 특성을 변경시켜줘야 하는 경우가 있다. 가장 간단한 예로 아이디와 패스워드를 입력받는 터미널기반의 프로그램을 만들어야 한다고 했을때, 패스워드 입력시에는 키보드로 입력되는 문자가 모니터에 바로 출력되게 하면 안될것이다. 이럴경우는 터미널의 특성을 변경시켜서 키보드입력이 화면에 반향(echo)되지 않도록 해주어야 한다. 다음의 예제 프로그램을 실행시켜 보자.

예제 : echo_off.c
  1. #include
  2. #include
  3. #include
  4. #include
  5. staticstructtermiosstored_settings;
  6. voidecho_off(void)
  7. {
  8. structtermiosnew_settings;
  9. tcgetattr(0,&stored_settings);
  10. new_settings=stored_settings;
  11. new_settings.c_lflag&=(~ECHO);
  12. new_settings.c_lflag&=(~ICANON);
  13. tcsetattr(0,TCSANOW,&new_settings);
  14. return;
  15. }
  16. voidecho_on(void)
  17. {
  18. tcsetattr(0,TCSANOW,&stored_settings);
  19. return;
  20. }
  21. voidget_pass(char*pass)
  22. {
  23. charbuf;
  24. inti=0;
  25. printf("Passwd:");
  26. echo_off();
  27. while((buf=getc(stdin))!='n')
  28. {
  29. pass[i]=buf;
  30. printf("%s","*");
  31. i++;
  32. }
  33. echo_on();
  34. }
  35. intmain()
  36. {
  37. charpass[16];
  38. memset(pass,0x00,16);
  39. get_pass(pass);
  40. printf("nYourinput:%sn",pass);
  41. return1;
  42. }



위의 프로그램은 사용자 패스워드를 입력받는 일을한다. 패스워드의 경우 화면에 바로 출력되면 안됨으로, 터미널의 라인 출력 특성을 "반향 끔" 으로 설정하고 키입력을 받아들이도록 했다. 그리고 사용자 키입력을 "*" 로 대체 시켜서 화면에 출력하도록 해서 사용자 패스워드를 입력 받도록 만들었다.


--------------------------------------------------------------------------------

2.2절. 터미널 장치 파일(tty)
각각의 터미널은 자신이 사용하는 장치파일에 연결해서 통신을 하게 된다. 예를들어 com1 포트와 시리얼 통신을 해야 한다면 /dev/ttyS0 과 연결을 해야 한다. 그렇지 않고 일반적인 개인 PC 의 표준터미널인 키보드&모니터 와 통신하기를 원한다면 /dev/tty0 과같은 장치파일과 연결해야 할것이다. 이러한 장치파일은 ASCII 코드중 화면에 표시되는 문자(chricter)를 이용해서 통신을 하게 됨으로 캐릭터 디바이스 파일(문자 장치파일) 이라고 부른다. ls -al 로 위의 파일의 정보를 알아보면 아래와 같을것이다.
[root@localhost /dev]# ls -al /dev/tty*
crw-rw-rw- 1 root root 5, 0 10월 12 2001 /dev/tty
crw--w---- 1 root root 4, 0 12월 1 12:21 /dev/tty0
crw--w---- 1 root tty 4, 1 12월 1 12:21 /dev/tty1
crw--w---- 1 root root 4, 10 10월 12 2001 /dev/tty10
crw--w---- 1 root root 4, 11 10월 12 2001 /dev/tty11
crw--w---- 1 root root 4, 12 10월 12 2001 /dev/tty12
crw--w---- 1 root root 4, 13 10월 12 2001 /dev/tty13
...


파일 리스트의 가장앞에 있는 'c' 가 캐릭터 디바이스 파일임을 나타내주는 표시이다.

이러한 장치파일에에 접근해서 원하는 장치와 통신하는 방법은 의외로 간단하다. 일반파일과 마찬가지로 open 한다음에 read, write 함수를 사용해서 정보를 읽고 쓰면 된다. | <-- APP 개발자영역 --> | <-- 디바이스 드라이버 개발자영역 --> |
+-----+ +-----------+ +------------+ +---------------+ +------+
| APP | --- | open(2) | --- | /dev/ttyS0 | -- | device driver | -- | 장치 |
+-----+ | read(2) | +------------+ +---------------+ +------+
| write(2) |
+-----------+


위의 그림은 일반 어플리케이션에서 어떻게 장치와 통신할수 있는지에 대한 계략적인 모양을 나타낸 그림이다. 장치는 키보드가 될수도 있을것이며, 때에 따라서는 COM,USB 포트가 될수도 있을것이다. 많이 알려져 있는 대부분의 장치 디바이스 드라이버는 이미 제작되어 있음으로 일반 어플리케이션 프로그래머라면 open, read, write 를 이용해서 장치와 통신하는 부분까지만 신경쓰면 된다. 그러나 알려져 있지 않은 장치를 컴퓨터에 연결해서 사용해야 할경우에는 직접 디바이스 드라이버를 제작해야 할것이다.

Barcode 리더기로 부터 읽어들인 데이타를 처리하는 어플리케이션을 만들고자 한다면, (com1 포트를 사용한다고 가정하자), 어플리케이션 제작자는 단지 /dev/ttyS0 을 open 한다음에 read 함수를 이용해서 읽을 데이타가 있는지 검사하고, 데이타가 들어오면 이것을 적당하게 처리하도록 해주면 된다. 물론 내부적으론 몇가지 다른 일들을 해줘야 겠지만, 개념적으로 보자면 매우 간단하게 구현가능함을 알수 있다.


--------------------------------------------------------------------------------

2.3절. termios 함수를 통한 터미널제어
유닉스에서는 이러한 터미널제어를 위해서 termios 라는 함수모음을 제공한다. 우리는 이 함수들을 통해서 터미널을 원하는 방향으로 제어할수 있게 된다. 이번장에서는 termios 함수들에 대한 설명과 이를 이용한 터미널제어의 방법에 대해서 알아보도록 하겠다.

기본적으로 termios 는 디바이스(장치)와의 asynchronous(비동기) 통신을 위한 프로그래밍 인터페이스를 제공한다.


--------------------------------------------------------------------------------

2.3.1절. 터미널 기본모드
터미널은 크게 2가지 모드인 "정규모드"와 "비정규모드" 로 나뉜다. 이것들은 터미널을 제어하는데 매우 중요한 요소임으로 별도의 장을 만들어서 설명을 했다.


--------------------------------------------------------------------------------

2.3.1.1절. Canonical Mode Input Processing
흔히 정규모드라고 하며 기본적으로 라인단위로 입출력을 처리하게 된다. 여기에서 말하는 라인의 개념은 우리들이 에디터에서 작업할때의 라인과 같은 개념으로 'n' 혹은 EOF(End-Of-File) 를 만날때까지의 문자열을 말한다. 보통 사용자와 컴퓨터와 대화하기 위한 입출력은 정규모드 상태에서 행해진다. 이상태에서는 문자열 입력후 Enter 키를 눌러야 리턴이 될것이다. (혹은 Ctrl+d 를 눌러서 EOF 를 발생시킬경우)

또한 정규 방식에서는 ERASE와 KILL 문자등이 허용된다. 정규방식 자체가 라인단위 입출력작동임으로 당연히 Erase, kill 문자를 사용할수 있을것이다.

기본적으로 터미널은 정규모드로 시작한다.


--------------------------------------------------------------------------------

2.3.1.2절. NonCanonical Mode Input Processing
비정규모드라고 한다. 정규모드가 라인단위로 입출력을 처리하는 것과 달리 비정규모드는 한바이트씩 처리하게 된다. 한바이트씩 처리하게 됨으로 정규모드에서 가능했던 여러가지 특수문자들(ERASE, KILL, EOF, NL, CR)을 사용할수 없게 된다. - 당연하다 이미 돌려진 문자에 대해서 ERASE 등을 할수 있을 턱이 없다 -

예제 echo_off.c 가 비정규모드로 작동하는 프로그램인데, delete 키등이 먹지 않음을 알수 있다. 위에서 말했듯이 비정규모드에서는 ERASE 문자가 사용되지 않기 때문이다. echo_off.c 를 비정규 모드로 작성한 이유는 정규모드로 할경우 개행문자 'n' 이 입력되기 전까지는 리턴되지 않음으로 바이트단위로 리턴하도록 하기 위해서이다. 위 예제코드에서 new_settings.c_lflag &= (~ICANON); 을 주석처리 한다음에 실행시키면 엔터키를 입력하기 전까지는 화면에 "*" 이 출력되지 않음을 알수 있을것이다. 대신 Delete 와 같은 몇몇 특수문자의 전달이 가능함을 알수 있다.


--------------------------------------------------------------------------------

2.3.2절. termios 구조체 - 터미널 속성구조체
모든 터미널 데이타는 다음의 termios 구조체의 각 플레그의 비트값을 읽어오거나 비트값을 세팅해줌으로써 검사와 설정을 할수 있다.
  1. struct
  2. {
  3. tcflag_tc_iflag;/*inputmodes*/
  4. tcflag_tc_oflag;/*coutputmodes*/
  5. tcflag_tc_cflag;/*contrlmodes*/
  6. tcflag_tc_lflag;/*localflag*/
  7. cc_tc_cc[NCCS];
  8. }



c_inflag 는 말그대로 입력과 관련되어서 터미널 속성을 변경하기 위해서 사용된다. c_oflag 는 출력과 관련된 속성변경을 처리히가 위해서, c_cflag 는 직렬(시리얼)통신과 관련된 터미널 속성변경을 위해서 사용된다. 마지막 c_lflag 는 실제 사용자에게 보여지는 터미널의 속성 즉 출력의 반향(ECHO)를 on/off, 특수입력문자들(Ctrl+C 와 같은)의 속성 제어를 제어하기 위해서 사용한다.

다음은 각각의 플래그를 통해서 설정할수 있는 터미널의 속성들이다. 아마 별로 사용하지 않는 몇가지 정도는 빠졌을수도 있음으로 자세한 모든 터미널 속성정보를 알고 싶다면 termios 의 man 페이지를 참고하기 바란다.

표 1. 터미널 속성값 - c_iflag

설명터미널 입력과 관련된 제어를 한다. 입력제어 값들은 모드 on 되어있는 상태이다.
IGNBRKbreak 컨디션을 무시한다. break 컨디션은 연속된 0의 값을 가지는 비트로 정의된다. 만약 IGNBRK 가 on 되어 있고 입력데이타에 break 컨디션이 전달된다면 무시하게 된다.
BRKINT이것은 break 컨디션 상에서 SIGINT 를 가로채기 위해서 사용된다. 만약 IGNBRK 가 off 되어있고, BRKINT가 세팅되어 있는 상태에서 break 컨디션이 입력된다면 이것은 출력쿠에 쌓이게 된다. 만약 터미널이 foreground process 상태로 돌고 있는 도중이라면, SIGINT 신호를 발생시키게 된다.
IGNPARparity 에러무시한다.
INPCKparity 체크를 실시한다.
ISTRIP만약 이 플레그를 on 시키면, 유효한 입력 문자를 처음 7bit 로 세팅하게 된다. 그렇지 않을경우 8bit 입력으로 처리한다.
INLCRNL 문자(new-line)를 CR(carriage return) 문자로 대체시킨다. 만약 이 플레그가 on 된다면, NL 문자는 CR 문자로 변경된다.
IGNCRCR 문자를 무시한다. on 될경우 입력되는 CR 문자를 무시한다. (읽지 않는다)
ICRNLCR 문자를 NL 문자로 대체시킨다. IGNCR 이 on 되어 있지 않은 상태에서 ICRNL이 on 되어 있을경우 받은 CR 을 NL 로 변경한다.
IXONstart 와 stop 출력제어를 활성화 한다. 만약 플레그가 on 인 상태에서 STOP 캐릭터를 받았다면 출력을 멈추게 된다. 그러다가 START 캐릭터를 받게 되면 다시 출력을 시작하게 된다. 이것은 flow-control(흐름제어)를 위한 용도로 사용되며, 실제 STOP, START 캐릭터를 읽어들이지는 않는다. 만약 플레그가 off 상태라면 STOP, START 캐릭터를 읽어들인다.
IXOFF입력제어를 위해서 start 와 stop 를 활성화 한다. 만약에 플레그가 on 으로 되어있다면 시스템은 입력큐가 가득 찼을때 STOP 캐릭터를 전송한다. 그리고나서 입력큐에 있는 데이타를 모두 읽었다면 START 캐릭터를 전송한다. IXON과 함께 흐름제어를 위해서 사용된다.
IXANY어떤 문자에 대해서라도 출력을 한다. 이 플레그가 on 이라면 입력된 어떤 문자라도 출력을 시작 하게 된다.
IMAXBEL만약 입력스트림이 overflows 될경우 ASCII BEL 을 반향한다.

표 2. 터미널 속성값 - c_iflag

설명출력을 어떻게 다룰지에 관한 설정을한다. 기본설정은 모든 비트에 대해서 on(1) 의 상태이다.
OPOSTPost-process output 모드. 만약 이 플레그가 off 상태라면 문자는 변화없이 전달된다. 그렇지 않고 on 이라면, 뒤에 오는 flag 에 의해서 변경될수 있다.
OLCUC이 플레그가 on 되어 있을경우 영문소문자 는 영문대문자로 치환되어서 전달된다.
ONLCR이 플레그가 on 되어 있을경우 NL 문자는 CR-NL 문자로 치환되어서 전달된다.
OCRNL이 플레그가 on 되어 있다면 CR 문자는 NL 문자로 치환된다.
ONOCR이 플레그가 on 되어 있다면 CR이 아닌 첫번째 문자부터 전달되게 된다.
OFILL시간지연을 위해서 fill 문자를 이용한다. 이 플레그가 on 되어 있다면, 문자 전달시간지연을 위해서 time 지연을 사용하지 않고 fill 문자를 전달하는 것으로 대신한다.
OFDEL이 플레그가 on 되어 있다면 fill 문자로 DEL이 전달된다.
NLDLYnew-line 문자지연이다. NL0 과 NL1 두개의 값이 준비되어 있다. NL0 은 지연없음이며, NL1 의 경우 약 0.1 초 정도의 지연시간이 생긴다. 만약 OFILL 플레그가 on 되어 있다면, 지연을 만들기 위해서 두개의 fill 문자를 전달한다.
CRDLYCR 문자지연이다. 여기에는 CR0, CR1, CR2, CR3 의 값이 준비되어 있다. CR0 은 지연없음, CR1 은 컬럼위치에 따라 지연시간 결정, CR2 는 약 0.10 초, CR3 는 약 0.15초의 지연이 생긴다.
TABDLY수평탭 시간지연이다. TAB0, TAB1, TAB2, TAB3 의 값이 준비되어 있다. TAB0은 지연없음, TAB1 은 컬럼위치에 따라 지연시간 결정, TAB2 는 0.1초가량의 지연된다. TAB3 로했을경우 탭은 스페이스로 확장된다.
BSDLY백스페이스키 시간지연이다. BS0과 BS1 이 준비되어 있으며, BS0은 지연없음, BS1 은 약 0.05 의 시간지연을 나타낸다. OFILL 플레그가 세팅되어 있으며 BS1 이라면 한개의 fill 문자를 보낸다.

표 3. 터미널 속성값 - c_cflag

설명하드웨어의 터미널제어에 관련된 속성들이다. 모뎀과 같은 하드웨어 제어에 많이 쓰인다.
CBAUDbaud rate 에 대한 설정이다. 하드웨어에 따라서 속도의 변화가 불가능한경우도 있다. 모뎀을 사용해본적이 있다면 baud rate 에 대해서 자주 들어보았을것이다. 자주 사용되는 baud rate 는 B4800, B9600, B19200, B38400 으로 각숫자가 baud 속도를 나타낸다. 참고로 baud 는 하드웨어의 데이타 처리 속도를 나타낸다. 이외에 B50, B75, B110, B134, B150, B200, B300, B600, B1200, B1800, B2400 이 있다. 마찬가지로 B 다음의 숫자가 baud 속도이다.
CSIZE문자의 크기를 지정하기 위해서 사용한다. CS5, CS6, CS7, CS8 이 준비되어 있으며, 각각 5, 6, 7, 8bit 를 나타낸다.
CSTOPBstop 비트의 수를 정한다. 이 플레그가 on 되어있다면 2개의 stop 비트를 그렇지 않다면 1개의 stop 비트를 보낸다.
CREADreceiver 을 활성화한다.
HUPCL이 플레그가 세팅되어 있다면, 마지막 프로세스가 종료되거나, 마지막 프로세스의 line(회선)이 닫힐경우 disconnect 가 발생한다.
PARENBparity 를 추가한다. 이 플레그가 on 되어 있으면, parity 를 생성하고 검색하게 된다. 각문자에 parity bit 가 추가된다.

표 4. 터미널 속성값 - c_lflag

설명로컬(사용자) 터미널에 관한 속성과 관련되어 있다. 초기값은 모두 on 상태이다.
ISIGsignal 을 받아들인다. 이 플레그가 on 되어 있다면, INTR, QUIT, SUSP, DSUSP 과 같은 특수 문자를 받아들인다.
ICANON이 플레그가 on되면 정규모드로 입력이 이루어진다.
NOFLSHqueue flush 를 비활성화 시킨다.
ECHO반향을 설정한다. 만약 이 플레그가 off 되어있다면 입력은 반향되지 않는다.
ECHOEerase 문자를 반향한다. 만약 이 플레그와 함께 ECHO 플레그가 on 되어있다면 ERASE 가 발생할경우 스크린에서 마지막 문자를 지우게 된다.
ECHOEerase 문자를 반향한다. 만약 이 플레그와 함께 ECHO 플레그가 on 되어있다면 ERASE 가 발생할경우 스크린에서 마지막 문자를 지우게 된다.
ECHOPRT만약 ECHO 플래그가 on 되어있고 ECHOPRT가 on 되었을경우 ERASE 가 발생한다면 (back 스페이스키를 입력한다면) 삭제되는 문자가 '' 뒤에 표시되게 된다. 만약 모든 문자를 삭제했다면 '/' 가 출력되게 된다.
ECHOKEBackspace-Space-Backspace entire line on line kill
ECHONLNL문자가 반향된다. ECHONL 플레그가 on 되어있다면, ECHO 플래그가 on 되어있지 않더라도 NL 문자가 반향된다.
ECHOCTL제어문자가 반향되도록 한다. 제어문자는 0에서 37 까지의 ASCII 코드이다. 이 플레그를 on 시킨상태에서 CTRL+X 같은 제어문자를 입력할경우 ^X 로 화면에 표시될것이다.

표 5. 제어문자 속성값 - c_cc

설명c_cc 배열은 제어문자를 제어하기 위해서 사용한다. 즉 CTRL+X, CTRL+X, CTRL+C 등의 문자와 관련된 제어를 할수 있다.
VINTR일시중지(Ctrl+C)와 관련된 제어이다. 만약 ISIG 플레그가 on 되어 있다면 일시중지 문자를 입력시키면 포그라운드 프로세스에 SIGINT 시그널이 발생된다.
VQUITQuit 제어문자 Ctrl+ 와 관련된다. ISIG 플래그가 on 되어 있고 Quit 제어문자가 입력되면 SIGQUIT 시그널이 발생한다.
VERASEERASE 제어문자(백스페이스) 와 관련된다. 정규모드(ICANON) 플래그 가 on 되어 있고, ERASE 제어문자가 발생하면 가장 마지막 문자가 지워진다.
VKILLKILL 제어문자 (Ctrl+u)와 관련된다.
VEOFCtrl-d 제어문자와 관련된다. ICANON 플래그가 on 되어 있고, EOF가 발생하면 읽기 대기중인 모든문자들은 개행문자를 만나지 않더라도 바로 프로세스에게 전달된다.
VSTOPSTOP 제어문자(Ctrl+s)와 관련된다.
VSUSPSUSP 제어문자 (Ctrl+z)와 관련된다. ISIG 플래그가 on 되어있는 상태에서 Ctrl+z 가 입력되면 모든 포그라운드 프로세스에 SIGSTOP 신호가 전달된다.
VWERSEWERASE 제어문자 (Ctrl+w) 와 관련된다.



--------------------------------------------------------------------------------

2.3.3절. 터미널 속성 얻어오기
터미널의 속성을 변경하기 위해서는 일단 현재 터미널이 속성을 얻어와야 한다. 그리고 나서 변경하고픈 터미널의 속성값을 비트연산을 이용해서 on/off시켜주면 된다. 현재 터미널의 속성을 얻어오기 위해서 tcgetattr 함수를 사용한다. 이함수를 사용하면 터미널의 속성값을 얻어와서 struct termios 구조체를 채운후 되돌려준다.