최근에 오래된 Heathkit 덤 터미널을 구입했는데 이를 colemak 키보드 레이아웃과 함께 사용하고 싶습니다. 터미널이 직렬을 통해 직접 ASCII 코드를 보내기 때문에 그런 것이 loadkeys
작동할 것이라고는 생각하지 않습니다. (있는 경우예레이아웃을 변경하는 간단한 솔루션을 알고 싶습니다. )
나의 현재 계획은 간단한 소프트웨어에서 수신되거나 전송되는 모든 바이트를 필터링하는 것입니다. (올바르게 설정되었음에도 불구하고) 호환되지 않는 이스케이프 코드를 여전히 사용하는 일부 명령줄 프로그램도 있으며 TERM
, 이러한 프로그램도 수동으로 필터링하고 싶습니다.
본질적으로 나는 agetty와 터미널 사이에 위치하여 바이트가 전송되거나 수신될 때 수동으로 바이트를 필터링할 수 있는 프로그램을 만들고 싶습니다.
바이트 필터링은 매우 간단하지만 이를 수행할 수 있는 agetty 인터페이스를 만드는 방법을 잘 모르겠습니다. 나만의 장치를 만들어야 합니까 mknod
?
(또한 바이트를 읽고 새 바이트를 쓰기 위해 터미널과 Linux 시스템 사이에 있는 마이크로 컨트롤러 또는 Raspberry Pi를 사용하는 것을 고려했습니다. 이 솔루션은 다루기 힘들 것이므로 가능하면 피하고 싶습니다.)
보거나 읽을 위치에 대한 제안은 매우 도움이 될 것입니다.
답변1
일부 "멍청한" 터미널에는 터미널의 "BIOS 설정"과 유사한 설정 메뉴가 내장되어 있습니다. 이러한 설정에는 일반적으로 키보드 레이아웃 선택이 포함됩니다. 하지만히스킷 터미널(어떤 모델인가요?) 아마도 너무 오래된 학교일 것입니다. 터미널에 키보드 레이아웃을 전환하는 메커니즘이 있더라도 Colemak 레이아웃은 2006년경에 개발되었기 때문에 이를 제공할 가능성은 거의 없습니다.
agetty
- 또는 모든 getty
프로세스 - init
TTY 장치를 초기화하고 적절한 재설정 코드를 터미널에 보내고 로그인 프롬프트를 표시하고 사용자 이름을 받기 위해(또는 PID #1이 무엇이든) 시작됩니다. 완료 되면 사용자로부터 비밀번호를 얻는 과정이 됩니다 getty
.exec()
login
하지만 주의하세요. 이것은 + exec()
가 아니라 단지 입니다 . 따라서 세션을 시작하는 작업이 완료되면 해당 프로세스는 사라지고 결국 사용자의 쉘로 대체됩니다. 사용자의 세션이 종료되면 TTY 장치에 더 이상 프로세스가 없음이 감지되고 프로세스를 다시 시작하기 위해 다른 인스턴스가 시작됩니다.fork()
exec()
getty
login
init
getty
따라서 터미널에서 들어오는 모든 문자를 계속 필터링하려면 세션 전체에서 동일하게 유지되는 것이 필요합니다. 사용자 세션이 종료되면 init
다음 로그인 세션을 위해 새 인스턴스를 시작할 수 있도록 프로세스가 사라지기를 원할 수 있습니다.
프로그램이 작업을 수행하는 동안 실제 직렬 포트 TTY 장치가 사용되므로 TTY 장치 인터페이스도 복사해야 합니다. 두 개의 개별 프로그램이 동일한 직렬 포트를 동시에 읽으려고 하면 비극이 발생할 뿐입니다. 다행히 처음부터 시작할 필요는 없습니다. TTY 인터페이스를 복사하는 것은 정확히의사 TTY그렇습니다. 바라보다 man 3 openpty
.
이와 같이 장치 설정을 초기화하고 적절한 재설정 코드를 터미널로 보내야 합니다 agetty
. 그러면 프로그램이 로그인 프롬프트를 표시하고 문자 필터링 루프를 초기화합니다. 사용자 이름 프롬프트에 대한 응답이 수신되면 의사 TTY, fork()
+ 의사 TTY의 "슬레이브" 측에 연결하고 필터링된 문자를 실제 터미널에서 마스터 측 의사로 전달하기 시작하는 프로그램을 exec()
요청 해야 합니다. login
-TTY. 의사 TTY에서 실제 터미널로 반환된 TTY 및 필터링되지 않은 출력입니다.
프로그램은 TTY 장치에서 데이터를 적극적으로 기다리면서 CPU 주기를 낭비해서는 안 되며 대신 select(2)
또는 poll(2)
시스템 호출을 사용하여 데이터가 처리될 때까지 효율적으로 기다려야 합니다.
독서ttysnoop
패키지 소스 코드TTY 세션을 기록하려면 유사한 작업을 수행해야 하므로 유용할 수 있습니다.