anonical이란, "규정대로"하는 프로그래밍을 의미하며, non-canonical이란 "규정에 따르지 않고"하는 프로그래밍을 의미한다. 초기의 교회에서, "canon" 즉 교회의 법규는 공식적으로 선정된 성구(聖句)였다. New Hacker's Dictionary의 저자인 에릭 레이몬드에 따르면, 이 단어는 그리스와 라틴 어원에서 "갈대"를 의미했으며, 일정한 길이의 갈대는 표준 척도로 사용되었다고 한다. 음악이나 문학과 같은 일부 지식 영역에서, "canon"은 모든 사람들이 공부하는 주요 저작품을 의미한다.
이 noncanonical input에서 VMIN과 VTIME을 가지고 입력 프로세스 기준을 설정하는데, VMIN은 최소 입력 버퍼의 크기이다.(크기가 3이라면 3만큼의 입력을 받고나서 가장 먼저 입력된 것을 처리한다.) VTIME은 입력 버퍼를 비워주는 timeout 시간이다. 설정된 시간만큼 입력이 없으면 버퍼에 있던 값들을 처리해준다.
위 함수를 minishell loop가 돌기 전에 초기화 해주고 실행한다면 아무 값도 보이지 않을 것이다. ~ECHO를 통하여 입력 시 터미널에서 보이지 않게 처리했기 때문이다. 후에 커서 제어를 위해 이 입력값들을 버퍼에 저장시켜두고 커서를 옮기고 히스토리를 출력할 과정을 위함이다.
일반적인 아스키 코드값을 제외한 값들(방향키, 특수키 등)은 보이지 않게하고 그렇지 않은 값들은 출력처리를 해주면 일반적인 쉘에서 처럼 처리할 수 있다.
termcap라이브러리를 이용한 커서 제어
입력받은 값(asdf 방향키 좌우상하)을 출력해보면 위와 같은 값이 나온다.(맥 os 기준)
따라서 방향키나 특수키를 사용하기 위해서는 버퍼의 크기가 char형으로는 부족하므로 int형으로 받아준다.
그리고 버퍼는 항상 0으로 초기화 하여 사용하여야되는데, 그 이유는 일반 ascii 범위의 문자들은 1바이트이기 때문에 다른 부분에 다른 값이 남아있으므로 키값이 깨지게 된다.