터미널 에뮬레이터
마스터 측은 터미널로가는 라인 (TX / RX 와이어 쌍)을 대체합니다.
터미널 은 전선 중 하나에서 수신하는 문자를 표시하고 (이 중 일부는 제어 문자이며 커서 이동, 색상 변경 등의 작업을 수행함) 입력 한 키에 해당하는 문자를 다른 와이어로 보냅니다.
xterm과 같은 터미널 에뮬레이터 는 와이어로 문자를 송수신하는 대신 파일 디스크립터에서 문자를 읽고 마스터 측으로 쓰는 것을 제외하고는 다릅니다. 일단 슬레이브 터미널을 스폰하고 쉘을 시작하면 더 이상 터치하지 않습니다. xterm은 와이어 쌍을 에뮬레이션하는 것 외에도 해당 파일 디스크립터를 통해 일부 라인 분야 특성을 마스터 측으로 변경할 수도 있습니다. 예를 들어, 크기 속성을 업데이트하여 SIGWINCH가 슬레이브 pty와 상호 작용하는 응용 프로그램으로 전송되어 변경된 크기를 알릴 수 있습니다.
그 외에 터미널 / 터미널 에뮬레이터에는 지능 이 거의 없습니다 .
터미널 장치 (pty slave와 같은)에 쓰는 것은 거기에 표시된다는 의미이며, 읽은 것은 입력 한 것이므로 터미널 에뮬레이터가 읽거나 쓰는 것은 의미가 없습니다. . 그들은 다른 쪽 끝에 있습니다.
tty 라인 훈련
의 많은 지능 에 청각 장애 라인 규율 . 라인 규율은 해당 장치와 라인 / 와이어 (pty의 마스터 측) 사이에있는 직렬 / pty 장치 위에 푸시 된 소프트웨어 모듈 (커널에 드라이버에 있음)입니다.
직렬 회선의 다른 쪽 끝에 터미널이있을 수도 있고 네트워킹을위한 마우스 나 다른 컴퓨터도있을 수 있습니다. 예를 들어 SLIP 회선 분야를 연결하여 직렬 장치 (또는 pty 장치) 위에 네트워크 인터페이스를 가져 오거나 tty 회선 분야를 가질 수 있습니다 . tty 라인 규율은 직렬 및 pty 장치의 경우 Linux의 기본 라인 규율입니다. Linux에서는 라인 규칙을로 변경할 수 있습니다 ldattach.
tty 라인 규율을 비활성화하면 효과를 확인할 수 있습니다 stty raw -echo(bash 프롬프트 또는 다른 대화식 응용 프로그램 vi은 터미널을 필요한 모드로 설정하는 것과 같은 다른 대화식 응용 프로그램은 cat경험이 없는 바보 응용 프로그램을 사용하려고 합니다). 그런 다음 슬레이브 터미널 장치에 쓰여진 모든 것이 xterm이 읽을 수 있도록 즉시 마스터 측에 작성되며, xterm이 마스터 측에 쓴 모든 문자는 슬레이브 장치에서 즉시 읽을 수 있습니다.
회선 규율은 터미널 장치 내부 회선 편집기 가 구현되는 곳입니다. 로 예를 들어 stty icanon echo(기본값으로) 입력 할 때 a, xterm 등의 글을 a다음 제어 규칙은, 마스터에 반향 을 다시 (A하게 a하여 읽을 수를 xterm표시)하지만, 슬레이브 측에 읽을 수있는 아무것도하지 않습니다 . 당신은 백 스페이스를 입력하면 그 다음, xterm 등은 보내 ^?거나 ^H(즉, 같은 캐릭터 라인 규율을 ^?나 ^H에 해당합니다 erase회선 제어 설정) 마스터 A를 다시 전송 ^H, space및 ^H대한 xterm를 지우려면a방금 화면에 입력했지만 슬레이브 측에서 읽는 응용 프로그램으로 아무것도 보내지 않고 내부 라인 편집기 버퍼를 업데이트하여 a이전에 입력 한 것을 제거합니다 .
그런 다음 Enter 키를 누르면 xterm은 ^M(CR)을 전송 합니다.이 라인 규칙은 입력시 입력을 ^ J (LF)로 변환하고 지금까지 입력 한 내용을 슬레이브 측에서 읽기 위해 전송합니다 (응용 프로그램에서 읽은 /dev/pts/x내용은 LF를 포함하여 입력했지만 a삭제 한 이후 는 입력하지 않았습니다. ) 마스터 측에서는 커서를 다음 줄과 화면 시작으로 이동하기 위해 CR과 LF를 보냅니다.
라인 분야는 또한 마스터 측 등에서 문자를 수신 할 때 터미널의 포 그라운드 프로세스 그룹으로 신호를 보내는SIGINT 역할을 합니다^C .
많은 대화식 터미널 응용 프로그램 은 해당 회선 분야 의 기능 대부분을 비활성화 하여 자체 구현합니다. 그러나 어쨌든 터미널 ( xterm)은 그에 거의 관여하지 않습니다 (표시하라는 내용을 표시하지 않음).
프로세스 및 터미널 장치 당 하나의 세션 만있을 수 있습니다. 세션에는 제어 터미널이 연결될 수 있지만 반드시 그럴 필요는 없습니다 (모든 세션은 터미널없이 열릴 때까지 시작됩니다). xterm, 쉘을 실행하기 위해 포크하는 프로세스에서는 일반적으로 새 세션을 작성하므로 (있는 xterm경우 시작한 터미널에서 분리 ) /dev/pts/x터미널 장치를 새 세션에 연결하여 생성 된 새 세션을여십시오. 그런 다음 해당 프로세스에서 셸을 실행하므로 셸이 세션 리더가됩니다. 해당 세션의 셸 또는 대화식 셸은 일반적으로 프로세스 그룹 및와 함께 tcsetpgrp()해당 터미널의 포 그라운드 및 백그라운드 작업을 설정합니다.
에 관해서는 정보가 TTY 분야 (직렬 또는 PTY)와, 단말 장치에 의해 저장하는지 , 즉 일반적으로 무슨 stty명령을 디스플레이 및 수정. 모든 분야 구성 : 터미널 화면 크기, 로컬, 입력 출력 플래그, 특수 문자 설정 (^ C, ^ Z ... 등), 입력 및 출력 속도 (Pty와 관련이 없음). 즉,에 해당하는 tcgetattr()/ tcsetattr()기능하는 리눅스받는지도 TCGETS/ TCSETSioctl의, 및 TIOCGWINSZ/ TIOCSWINSZ화면 크기. 현재 포 그라운드 프로세스 그룹이 터미널 장치 ( tcsetpgrp()/ tcgetpgrp(), TIOC{G,S}PGRPioctls) 또는 현재 입력 또는 출력 버퍼에 저장된 다른 정보라고 주장 할 수 있습니다 .
단말 장치에 저장된 스크린 크기 정보는 현실을 반영하지 않을 수 있음에 유의한다. 터미널 에뮬레이터는 일반적으로 창 크기를 조정할 때 (마스터 크기에서 동일한 ioctl을 통해) 설정하지만, 응용 프로그램이 슬레이브 측에서 ioctl을 호출하거나 크기 조정이 전송되지 않은 경우 동기화되지 않을 수 있습니다 예를 들어 무시하면 sshdif에 의해 생성 된 다른 pty를 의미하는 ssh 연결 ). 또한 일부 터미널은 이스케이프 시퀀스를 통해 크기를 쿼리 할 수 있으므로 응용 프로그램에서 이러한 방식으로 쿼리하고 해당 정보를 사용하여 라인 규칙을 업데이트 할 수 있습니다.sshSIGWINCH
자세한 내용 은 데비안 의 termiosand tty_ioctl페이지 를 참조하십시오 .
다른 분야의 훈련을하려면 :
의사 터미널로 마우스를 에뮬레이션하십시오.
socat pty,link=mouse fifo:fifo
sudo inputattach -msc mouse # sets the MOUSE line discipline and specifies protocol
xinput list # see the new mouse there
exec 3<> fifo
printf '\207\12\0' >&3 # moves the cursor 10 pixels to the right
위의 pty의 마스터 측은 socat에 의해 명명 된 파이프 ( fifo) 로 종료됩니다 . 우리는 그 fifo를 마우스 시스템 프로토콜에서 의미하는 0x87 0x0a 0x00을 쓰는 프로세스 (쉘)에 연결합니다 no button pressed, delta(x,y) = (10,0). 여기서 우리는 (쉘) 터미널을 에뮬레이션하지 않지만, 마우스, 우리가 보내는 3 바이트는 터미널 장치에서 응용 프로그램에 의해 읽히지 않아야합니다 ( mouse위의 socat일부 /dev/pts/x장치 는 심볼릭 링크입니다 ) 마우스 입력 이벤트로 해석됩니다.
SLIP 인터페이스를 만듭니다.
# on hostA
socat tcp-listen:12345,reuseaddr pty,link=interface
# after connection from hostB:
sudo ldattach SLIP interface
ifconfig -a # see the new interface there
sudo ifconfig sl0 192.168.123.1/24
# on hostB
socat -v -x pty,link=interface tcp:hostA:12345
sudo ldattach SLIP interface
sudo ifconfig sl0 192.168.123.2/24
ping 192.168.123.1 # see the packets on socat output
위의 직렬 와이어는 socathostA와 hostB 사이의 TCP 소켓으로 에뮬레이트됩니다 . SLIP 회선 규율은 해당 가상 회선 을 통해 교환 된 바이트를 sl0인터페이스 에서 전달하기 위해 SLIP 캡슐화 된 IP 패킷으로 해석 합니다 .