이스케이프 시퀀스는 각각 ETX 및 SUB를 사용하는 Ctrl-C 및 Ctrl-Z와 같은 ASCII 제어 문자와 공통적으로 쌍을 이룹니다.
위키피디아에서제어 코드페이지에는 대부분의 쌍이 있지만 인용된 참고문헌은 없습니다.
제어 문자와 키 시퀀스 쌍이 표준의 일부입니까?
Linux 및 기타 운영 체제 목록은 어디에 있습니까?
이러한 쌍을 나열하는 매뉴얼 페이지가 있습니까?
그것은 순전히 수십 년 동안 존재해 온 암묵적인 합의인가?
인용하다
- 리눅스termios 맨페이지(3)목록일부안에.
- 명령
stty -a
목록일부귀하의 시스템에 딱 맞습니다.
답변1
쌍은 1부터 26까지의 "라틴 문자"(및 관련된 나머지 ASCII 문자)입니다.
Ctrl-CETX를 제공하며 바이트 값 3( 0x03
, 000000011
) C
은 ASCII 67( 0x43
, 010000011
)입니다. 비트 7(플러스/마이너스 64)을 뒤집어 한 비트에서 다른 비트로 이동합니다. SUB는 위에 나열된 대로 바이트 값 26 등입니다.당신이 언급한 Wikipedia 페이지1~26, AZ 순으로 배열하세요.
다른 C0 컨트롤은 Ctrl알파벳이 아닌 다른 문자에 해당합니다. NUL은 ASCII 64와 Ctrl-@마찬가지로 이고 (91)은 ESC (27)에 해당하는 식으로 스페이스바를 누를 때까지 계속됩니다.@
[
ASCII 코드이러한 바이트는 유니코드 및 기타 여러 인코딩 표준과 마찬가지로 이러한 레이블과 (어느 정도) 의미를 사용하여 정의됩니다. 비트를 뒤집는 데 사용되는 것은 Ctrl터미널이나 입력 드라이버에 의해 결정되지만 "제어 문자"라는 이름은 페어링이 발생하는 방식을 암시합니다. 이 전통을 따르는 모든 시스템에서는 문자와 바이트 간에 동일한 대응 관계를 갖습니다.
반면에, 적어도 최신 Unix 계열 시스템에서는 많은 ASCII 컨트롤과 해당 키 시퀀스가 사용되지 않거나 원래 의도한 것과 다른 목적으로 사용됩니다. 사실상 여전히 상당히 병렬적이지만 Ctrl-C일반적 으로 유휴 상태를 동기화하는 대신 텍스트 입력을 시작하는 데 사용됩니다. 예를 들어 저는 실제로 그룹 구분 기호를 본 적이 없습니다.Ctrl-DCtrl-V
답변2
나는 1984년에 ANSI 코드 X3.64-1979, ANSI X3.4-1977 및 ANSI X3.41-1974를 요약한 문서를 작성했습니다. 이것ansicode.txt제어 코드가 DEC LA 시리즈 하드카피 터미널과 VT 시리즈 비디오 터미널에 어떤 영향을 미치는지 설명합니다.
답변3
법적 표준화 - 아닐 수도 있음
POSIX의 일부라는 점을 배제할 수 있습니다.POSIX는 전체 ASCII 세트 또는 ASCII 인코딩(숫자 값)을 요구하지 않으려고 합니다., 이 매핑은 다음을 기반으로 합니다. 예를 들어 POSIX에는 언급한 ETX 문자가 필요하지 않습니다. POSIX는 또한 사용할 문자를 논의할 때 기본값으로 Control-C/ETX 또는 Control-Z/SUB를 언급하지 않습니다.INTR 및 SUSP, 예를 들어.
다른 사람들이 지적했듯이 Ctrl 키 동작은본질적으로문자 세트/문자 인코딩 정의의 일부입니다. Ctrl 키 맵이 ASCII의 일부로 지정되지 않은 것 같습니다. 또한 ANSI 터미널 표준 제품군의 일부인 것으로 보이지 않습니다.
사실상의 표준화 - VT100?
나는 이 동작이 이전에 일어날 것이라고 예상했지만 VT100/VT102가 사실상의 표준이 되었다는 사실을 기반으로 이 동작에 대한 기대를 부분적으로 설명할 수 있다고 생각합니다. 바라보다"터미널은 어떤 프로토콜/표준을 사용합니까?"
VT102 사용자 가이드를 참조하세요."텔레포트된 캐릭터"->"기능키"->"제어문자키".
그림 4-3제어 문자를 생성하는 키를 표시합니다. 두 가지 방법으로 제어 문자를 생성할 수 있습니다.
- Ctrl 키를 누른 채 그림 4-3에서 음영 처리되지 않은 키를 누르십시오.
- Ctrl을 사용하지 않고 그림 4-3에서 음영 처리된 키 중 하나를 누르십시오. 이러한 특수 키는 Ctrl을 사용하지 않고 제어 문자를 생성합니다.
표 4-2키보드에서 생성된 제어 문자를 나열합니다. 컴퓨터 시스템마다 각 제어 문자를 다르게 사용할 수 있습니다.
참고: VT102에서 생성된 일부 제어 문자는 이전 디지털 터미널과 다릅니다.표 4-3변경 사항을 나열합니다.
나는 이 마지막 메모가 특히 흥미롭다고 생각합니다. VT102는 NUL에 Control-space를 사용하는 반면 Digital의 "이전 터미널"은 Control-@을 사용했습니다. 또한 마지막 두 개의 C0 컨트롤(RS 및 US)의 이스케이프를 변경합니다. (이것이 비트 7을 뒤집는 패턴에 어떻게 들어맞는지 궁금합니다.)VT100은 제어 공간도 사용합니다., 그래서 "이전 터미널"이 다음을 참조한다고 가정합니다.VT52가족.
리눅스 커널
PS/2 키보드와 USB 키보드 등 다양한 하드웨어 드라이버에서는 복제되지 않습니다. 그와는 반대로,VT층. 바라보다 vt/keyboard.c
. 키보드 수정자(Control 포함)의 상태는 에 저장됩니다 shift_state
. 그런 다음 Shift 상태를 사용하여 키맵을 선택합니다.
param.shift = shift_final = (shift_state | kbd->slockstate) ^ kbd->lockstate;
param.ledstate = kbd->ledflagstate;
key_map = key_maps[shift_final];
https://elixir.bootlin.com/linux/v4.16.8/source/drivers/tty/vt/keyboard.c#L1393
그래서 더 자세히 알아보려면 조사해 봐야 할 것 같아요키맵VT 레이어에서 사용됩니다. 저는 Control의 키맵이 귀하가 설명하는 페어링을 생성하도록 설정되어 있다고 가정합니다.
이것로드 키매뉴얼 페이지에는 커널 기본 키 매핑도 언급되어 있습니다. 이 내용은 매뉴얼 페이지가 작성된 이후 이동되었습니다.드라이버/tty/vt/defkeymap.c_shipped. 이 테이블을 읽으려면 인덱스에 사용되는 Linux 키 코드를 알아야 합니다. QWERTY 키보드를 기반으로 하므로 문자가 알파벳순도 연속형도 아닙니다. 바라보다/uapi/linux/input-event-codes.h 포함. 아니면 더 나은,이 테이블 키코드와 기본 컨트롤 매핑이 표시됩니다.