사용자가 키보드를 누르면 키보드 콘트롤러는 커널 키보드 드라이버로
스캔코드를 보내게 된다. 코드값을 바꿀 수 있는 키보드도 있지만
보통은 각 키에 고정되어 할당된 스캔코드가 있다. X
가 실행되어
있는 경우처럼 시스템이 스캔모드에 있을 때는 커널 키보드
드라이버가 하는 일이라곤 그냥 스캔코드를 전달받아 어플리케이션
프로그램에 전달해주는 것 뿐이다. 스캔모드가 아닌 경우에는 키가
눌리거나 풀리는 각각의 이벤트에 따라 스탠코드의 조합을 분석하여
키코드를 만든다. (하나의 키가 눌려도 최대 6개의 스캔코드가 발생할
수 있다.) 이렇게 만들어진 키코드가 (예를 들어 showkey
와 같은
프로그램에서 사용되는) 키코드 모드에서는 어플리케이션 프로그램에
전달된다. 키코드 모드도 아닌 경우에는 이 키코드를 keymap에서 찾아보고,
여기서 발견된 문자나 문자열을 어플리케이션에 전달하거나 해당되는
동작을 수행한다.
(예를 들어보자. a
키를 눌렀다 떼면 키보드는 스캔코드 0x1e와 0x9e를
발생시킨다. 이것은 키코드 30과 158로 변환되어 아스키 코드 즉,
latin-1 코드 `a'에 해당하는 0141로 전달된다. Delete
키의 경우에는
스캔코드 0xe0 0x53 0xe0 0xd3가 발생하고 이것은 키코드 111과 239로
변환되어 4-심볼 시퀀스인 ESC [ 3 ~로 전달된다. 물론 이것은
US 키보드에 디폴트 키맵의 경우에 해당되는 이야기다. 하나의 동작에 대응하는
키 조합의 예로는 Ctrl-Alt-Del이 있다.)
스캔코드와 키코드간의 변환은 setkeycodes
유틸리티를 사용하면 된다.
아마도 이 기능이 필요한 사람은 극히 드물 것이다. 키코드를 문자, 문자열, 동작
등 키맵으로 변환하는 것은 loadkeys
와 setmetamode
유틸리티를
사용하면 된다. 더 자세한 내용은 getkeycodes(8), setkeycodes(8), dumpkeys(1),
loadkeys(1), setmetamode(1)를 참조할 것. dumpkeys
의 화일 출력 형식과
loadkeys
를 사용한 화일 읽기는 keytables(5)에 설명되어 있다.
위에서 `어플리케이션으로 보낸다'라고 말한 것의 정확한 의미는 터미널 드라이버로
보낸다는 뜻이다. 즉, 이 이후의 처리 과정은 시리얼 라인을 통해 오가는 텍스트와
똑같다. 이 처리 과정에 대한 세부 사항은 stty
프로그램으로 설정한다.