의사 터미널을 생성하는 프로그램이 터미널을 시뮬레이션합니까?

의사 터미널을 생성하는 프로그램이 터미널을 시뮬레이션합니까?

내가 이해한 바로는 pty(마스터/슬레이브 쌍)를 생성하는 애플리케이션은 두 가지 범주로 나눌 수 있습니다.

  • 그래픽 출력을 생성한다고 하는 터미널 에뮬레이터( xterm, , ...)urxvt
  • 나머지( docker, ssh, tmux, screen...)는 텍스트 출력을 생성한다고 합니다.

이는 전자가 그래픽 디스플레이에 어느 정도 그려야 함을 의미합니다. 후자는 전자에 대한 텍스트 출력(선택적으로 이스케이프 시퀀스 포함)을 생성합니다. 당신이 얻어야 할 것은 일련의 터미널 에뮬레이터입니다(예: xterm<-> ssh<-> tmux<-> docker). 체인의 다양한 부분은 이스케이프 시퀀스를 한 언어에서 다른 언어로 변환합니다. 또는 더 정확하게는 이스케이프 시퀀스를 처리하고 terminfo데이터베이스를 사용하여 이를 다음 터미널 에뮬레이터로 변환합니다.

아래 사진은 출처입니다"TTY 공개"다음도 순서대로 있을 수 있습니다.

그렇다면 그 원인은 무엇입니까 xterm xterm? 이스케이프 시퀀스를 처리 합니까 xterm, 아니면 커널이 작업을 수행하도록 합니까? 즉, xterm terminfo데이터베이스 항목이... 커널에 해당합니까, 아니면 xterm? 글쎄요, 이렇게 말하면 답은 분명해 보입니다. 커널이 terminfo어떤 방식으로든 데이터베이스 항목에 영향을 미치는지는 아직 알 수 없습니다 .

다른 프로그램은 어떻습니까? pty를 생성하면 이스케이프 시퀀스를 처리하지 않는 빈 터미널이 제공되며 이러한 처리를 추가할 책임이 있습니까? 이것은 당신이 다루고 있는 이스케이프 시퀀스가 TERM​​반대편의 변수 값을 결정한다는 것을 의미합니까? 여기서 뭔가 빠졌나요?

이 질문은 다음에서 영감을 얻었습니다.아래 답변, 저자는 이 TERM값이 중요하지 않다고 주장합니다.

답변1

이미지가 정확합니다. 커널은 (적어도 이 질문의 맥락에서) 다음을 수행합니다.아니요터미널 에뮬레이터 역할을 합니다. 라인 규율을 다루고, 라인 규율이 무엇을 의미하는지 이해하기 위해 참조 stty(1)및 매뉴얼을 다룹니다. termios(3)여기에는 CR-LF 변환, ^C(인터럽트) 처리, 일부 최소한의 줄 편집 기능( ^W실행하는 명령에 cat자체 줄 편집 기능이 없는 경우 백스페이스 키 처리를 구현하는 "요리" 모드라고 함)이 포함되어 있으며 전송만 가능합니다. Enter를 누르면 전체 라인), 제어 흐름, 직렬 포트 속성(거의 사용되지 않음) 등 그러나 \e이스케이프 문자 는 처리하지 않습니다 .

이제 Linux 커널은 이미지의 "xterm" 노드와 유사한 터미널 에뮬레이터를 구현합니다. vt구성요소가 아닌 리눅스 커널의 구성요소 인 가상 콘솔(보통 Ctrl+Alt+F1 등)입니다 tty. 질문에 관한 한 이것은 관련이 없으며 귀하의 질문은 Linux에만 국한되지 않으며 이와 관련하여 다른 Unix 변형에 익숙하지 않습니다.

이스케이프 시퀀스를 처리 합니까 xterm, 아니면 커널이 작업을 수행하도록 합니까?

이것은 xterm. 지나치게 단순화된 이야기: xterm이 시작되면 tty 라인(마스터 및 슬레이브)을 설정하고 해당 tty에 연결된 명령을 시작합니다(일반적으로 쉘, TERM올바르게 설정된 경우 그림의 "사용자 프로세스" )는 다음과 같은 그래픽 창을 표시합니다. 커서를 왼쪽 상단에 놓습니다. 그런 다음 양방향으로 통신합니다.

키를 누르면 화살표로 표시된 순서대로 전송됩니다. 줄 규칙에 따라 커널은 이를 자체적으로 처리할 수 있습니다(예: 실행 중이고 cat문자 "x"를 누르면 전송되지 않았습니다 cat. 기본 줄 편집을 처리하는 것은 커널입니다). 이 경우 커널은 다음과 같이 알려줍니다. 터미널은 디스플레이를 업데이트하거나(아마도 "x"를 인쇄하여) 관련 사용자 프로세스에 키 입력을 전달할 수 있습니다.

다른 방향에서는 사용자 프로세스가 디스플레이를 업데이트하기를 원하거나 원하지 않을 수 있으며(수신된 키 누르기에 관계없이 이를 수행하기를 원할 수 있음) 데이터는 반대 방향의 경로를 통과합니다.

애플리케이션이 .line 으로 x\e[31my\n변환되는 .line 규칙을 출력하지만 (그렇지 않으면 "계단 효과"가 발생함) 문자를 신경 쓰지 않으므로 터미널 에뮬레이터가 .\n\r\n\ex\e[31my\r\n

xtermx이 메시지를 받고 다음과 같이 말했습니다. 커서에 an을 인쇄 해야 합니다 . 그러면 빨간색으로 전환한 다음 (빨간색)을 인쇄한 다음 커서를 한 줄 앞뒤로 이동해야 \e[31m한다는 의미입니다 . y그렇게 하고 그에 따라 디스플레이를 업데이트합니다.

즉, xterm terminfo데이터베이스 항목이... 커널에 해당합니까, 아니면 xterm?

용어 정보설명하다사용자 애플리케이션에 대한 다양한 터미널 에뮬레이터의 동작(모든 터미널 에뮬레이터가 이스케이프 시퀀스를 약간 다르게 처리하기 때문) 커널은 이에 대해 아무것도 모릅니다.

커널과 terminfo가 말하는 내용에는 약간의 중복이 있지만(예를 들어 terminfo에는 백스페이스 문자(또는 ^H) 에 대한 항목이 포함될 수 있지만 ^?이 동작은 터미널 에뮬레이터가 아닌 줄 규칙에서 구현됩니다. 터미널 에뮬레이터는 터미널 에뮬레이터 자체가 아니더라도 유효하도록 터미널 에뮬레이터의 동작을 설명하지만 이 작업을 커널의 라인 규칙에 위임한다는 의미에서 그에 따라 라인 규칙을 구성해야 합니다. 어쨌든, 나는 이것이 규칙이 아니라 예외라고 생각합니다. 규칙은 터미널 에뮬레이터 자체의 동작을 설명하는 용어 정보입니다.

의사 터미널을 생성하는 프로그램이 터미널을 시뮬레이션합니까?

아니요, 반드시 그런 것은 아닙니다. 터미널 라인 생성을 위한 애플리케이션을 다음과 같이 분류하겠습니다.

  • 터미널 에뮬레이터( xterm, urxvt, screen, tmux, ...)
  • 터미널 에뮬레이터가 아님( ssh(대화식이거나 -t제공되는 경우),,, script... luit)

나는 그것에 익숙하지 않지만 docker두 번째 그룹에 속한다고 생각합니다.

두 번째 그룹에는 기본적으로 tty 라인을 생성해야 하지만 이스케이프 시퀀스와 관련이 없는 데이터를 전달하거나 기록하거나 단순히 조작하는 데만 필요한 애플리케이션이 포함되어 있습니다. 이러한 애플리케이션은 \e그것이 무엇을 의미하는지, 빨간색이 무엇을 의미하는지 모르고 \e[31m, "빨간색"이 무엇을 의미하는지조차 모르고, 주어진 순간에 터미널의 캔버스가 어떤 모습이어야 하는지도 모릅니다.

첫 번째 그룹은 이러한 이스케이프 시퀀스에 주의를 기울여야 하는 애플리케이션입니다. 처음에는 놀랄 screen수도 있지만 tmux이러한 앱이 맹목적으로 데이터를 전달하여 동작을 달성할 가능성은 전혀 없습니다. 탭을 다시 연결하거나 탭 간에 전환할 때 캔버스를 복원할 수 없으며 동시에 여러 터미널의 창 레이아웃을 처리할 수도 없습니다. . 이러한 도구는 각 이스케이프 시퀀스를 구문 분석하고 완전히 이해해야 하며 캔버스가 어떻게 보여야 하는지 정확하게 메모리에 추적해야 합니다.

저는 Windows screentmuxWindows를 터미널 에뮬레이터로 생각하는 것을 선호합니다. Windows와 Friends와의 주요 차이점 xterm은 사용자에게 콘텐츠를 제공하는 캔버스인 백엔드가 창의 픽셀이 아니라 또 다른 터미널 에뮬레이터의 문자 그리드라는 것입니다. GUI. (다른 주요 차이점은 분리 및 재연결 기능인데 여기서는 관련이 없습니다.)

이 모든 것이 이해되길 바랍니다.

관련 정보