터미널 에뮬레이터
마스터 측은 터미널로가는 라인 (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
/ TCSETS
ioctl의, 및 TIOCGWINSZ
/ TIOCSWINSZ
화면 크기. 현재 포 그라운드 프로세스 그룹이 터미널 장치 ( tcsetpgrp()
/ tcgetpgrp()
, TIOC{G,S}PGRP
ioctls) 또는 현재 입력 또는 출력 버퍼에 저장된 다른 정보라고 주장 할 수 있습니다 .
단말 장치에 저장된 스크린 크기 정보는 현실을 반영하지 않을 수 있음에 유의한다. 터미널 에뮬레이터는 일반적으로 창 크기를 조정할 때 (마스터 크기에서 동일한 ioctl을 통해) 설정하지만, 응용 프로그램이 슬레이브 측에서 ioctl을 호출하거나 크기 조정이 전송되지 않은 경우 동기화되지 않을 수 있습니다 예를 들어 무시하면 sshd
if에 의해 생성 된 다른 pty를 의미하는 ssh 연결 ). 또한 일부 터미널은 이스케이프 시퀀스를 통해 크기를 쿼리 할 수 있으므로 응용 프로그램에서 이러한 방식으로 쿼리하고 해당 정보를 사용하여 라인 규칙을 업데이트 할 수 있습니다.ssh
SIGWINCH
자세한 내용 은 데비안 의 termios
and 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
위의 직렬 와이어는 socat
hostA와 hostB 사이의 TCP 소켓으로 에뮬레이트됩니다 . SLIP 회선 규율은 해당 가상 회선 을 통해 교환 된 바이트를 sl0
인터페이스 에서 전달하기 위해 SLIP 캡슐화 된 IP 패킷으로 해석 합니다 .