Emulatory terminali
Strona master zastępuje linię (parę przewodów TX / RX), która przechodzi do terminala.
Terminal wyświetla znaki, które otrzymuje na jednym z drutów (niektóre z nich są znakami kontrolnymi i sprawiają, że robi on takie rzeczy, jak przesuwanie kursora, zmiana koloru ...) i wysyła na innym przewodzie znaki odpowiadające wpisanym klawiszom.
Emulatory terminali, takie jak xterm, nie różnią się, z wyjątkiem tego, że zamiast wysyłać i odbierać znaki na przewodach, odczytują i zapisują znaki ze swojego deskryptora pliku po stronie master. Po tym, jak odrodzili terminal niewolników i uruchomili na nim twoją powłokę, już go nie dotykają. Oprócz emulacji pary przewodów, xterm może również zmienić niektóre właściwości dyscypliny linii za pomocą tego deskryptora pliku na stronę główną. Na przykład mogą zaktualizować atrybuty rozmiaru, aby SIGWINCH został wysłany do aplikacji, które wchodzą w interakcję z urządzeniem slave, aby powiadomić ich o zmianie rozmiaru.
Poza tym w terminalu / emulatorze terminali jest mało inteligencji .
To, co piszesz na urządzeniu końcowym (takim jak pty slave), jest tym, co masz na myśli, aby tam zostać wyświetlone, co odczytujesz z tego, co tam napisałeś, więc emulator terminala nie ma sensu czytać ani pisać na tym urządzeniu . Są tymi na drugim końcu.
Dyscyplina linii tty
Dużo inteligencji jest w tej dyscyplinie linii tty . Dyscyplina liniowa to moduł oprogramowania (rezydujący w sterowniku, w jądrze) wciśnięty na urządzenie szeregowe / pty, które znajduje się między tym urządzeniem a linią / przewodem (strona master dla pty).
Linia szeregowa może mieć terminal na drugim końcu, ale także mysz lub inny komputer do pracy w sieci. Możesz dołączyć dyscyplinę linii SLIP, na przykład, aby uzyskać interfejs sieciowy na urządzeniu szeregowym (lub urządzeniu pty), lub możesz mieć dyscyplinę linii tty . Dyscyplina linii tty jest domyślną dyscypliną linii przynajmniej w Linuksie dla urządzeń szeregowych i pty. W systemie Linux możesz zmienić dyscyplinę linii ldattach
.
Możesz zobaczyć efekt wyłączenia dyscypliny linii tty, wydając stty raw -echo
(zauważ, że monit bash lub inne interaktywne aplikacje, takie jak vi
ustaw terminal w dokładnie tym trybie, którego potrzebują, więc chcesz użyć głupiej aplikacji, takiej jak cat
ta). Następnie wszystko, co jest zapisywane w urządzeniu końcowym slave, powoduje, że xterm od razu przechodzi do strony master, a każdy znak zapisany przez xterm do strony master jest natychmiast dostępny do odczytu z urządzenia slave.
W dyscyplinie liniowej jest implementowany wewnętrzny edytor linii urządzenia końcowego . Na przykład za pomocą stty icanon echo
(jak jest to ustawienie domyślne), gdy a
piszesz, xterm zapisuje a
do mastera, a następnie dyscyplina liniowa powtarza go z powrotem ( a
udostępnia do odczytu xterm
do wyświetlenia), ale nie udostępnia niczego do czytania po stronie slave . Następnie po wpisaniu Backspace, xterm wysyła ^?
lub ^H
charakter, dyscyplinę linii (jako że ^?
albo ^H
odpowiada erase
ustawieniu dyscypliny linia) wysyła z powrotem na opanować ^H
, space
a ^H
dla xterm
wymazaća
właśnie wpisane na swoim ekranie i nadal nie wysyła nic do wniosku czytając od strony Slave, to po prostu aktualizuje swój wewnętrzny bufor edytora linia usunięcie że a
masz wpisane wcześniej.
Następnie, gdy naciśniesz Enter, xterm wysyła ^M
(CR), które dyscyplina liniowa konwertuje na wejściu do ^ J (LF), i wysyła to, co do tej pory wprowadziłeś do czytania po stronie slave (odczyt aplikacji /dev/pts/x
otrzyma to, co wpisałeś w tym LF, ale nie a
odkąd go usunąłeś), podczas gdy po stronie wzorcowej wysyła CR i LF, aby przesunąć kursor do następnej linii i początku ekranu.
Dyscyplina liniowa jest również odpowiedzialna za wysyłanie SIGINT
sygnału do grupy procesów pierwszego planu terminala, gdy odbiera on ^C
znak po stronie master itp.
Wiele interaktywnych aplikacji terminalowych wyłącza większość funkcji tej dyscypliny liniowej, aby sami ją wdrożyć. Ale w każdym razie strzeż się, że terminal ( xterm
) ma niewielki udział w tym (z wyjątkiem wyświetlania tego, co ma wyświetlić).
I może istnieć tylko jedna sesja na proces i na urządzenie końcowe. Sesja może mieć dołączony terminal kontrolny, ale nie musi (wszystkie sesje rozpoczynają się bez terminala, dopóki go nie otworzą). xterm
W procesie, że widelce wykonać powłokę zwykle utworzyć nową sesję (a więc odłączyć od terminala, na którym uruchomiono xterm
ze jeśli występuje), otwórz nowy /dev/pts/x
to zrodził, przez które dołączenie tego urządzenia terminala do nowej sesji. Następnie wykona powłokę w tym procesie, dzięki czemu powłoka stanie się liderem sesji. Powłoka lub dowolna powłoka interaktywna w tej sesji zwykle żongluje z grupami procesów oraz tcsetpgrp()
, aby ustawić zadania pierwszego planu i tła dla tego terminala.
Jeśli chodzi o to, jakie informacje są przechowywane przez urządzenie końcowe z dyscypliną tty (szeregową lub pty) , zazwyczaj to stty
polecenie wyświetla i modyfikuje. Konfiguracja wszystkich dyscyplin: rozmiar ekranu terminala, lokalny, flagi wyjściowe, ustawienia znaków specjalnych (takich jak ^ C, ^ Z ...), prędkość wejściowa i wyjściowa (nie dotyczy ptys). Odpowiada to funkcjom tcgetattr()
/, tcsetattr()
które w Linuksie mapują na TCGETS
/ TCSETS
ioctls i TIOCGWINSZ
/ TIOCSWINSZ
dla rozmiaru ekranu. Możesz argumentować, że bieżąca grupa procesów pierwszego planu jest inną informacją przechowywaną w urządzeniu końcowym ( tcsetpgrp()
/ tcgetpgrp()
, TIOC{G,S}PGRP
ioctls) lub w bieżącym buforze wejściowym lub wyjściowym.
Pamiętaj, że informacje o rozmiarze ekranu przechowywane w urządzeniu końcowym mogą nie odzwierciedlać rzeczywistości. Emulator terminala zwykle ustawia go (za pomocą tego samego ioctl w rozmiarze głównym), gdy jego okno jest zmieniane, ale może się nie zsynchronizować, jeśli aplikacja wywoła ioctl po stronie slave lub gdy zmiana rozmiaru nie zostanie przesłana (w przypadku połączenia ssh, które implikuje inny pty spawnowany przez, sshd
jeśli na przykład ssh
ignoruje SIGWINCH
). Rozmiar niektórych terminali można również zapytać o sekwencje specjalne, więc aplikacja może w ten sposób zapytać o to i zaktualizować dyscyplinę liniową o te informacje.
Aby uzyskać więcej informacji, możesz na przykład spojrzeć na strony termios
i tty_ioctl
man w Debianie.
Aby grać z innymi dyscyplinami liniowymi:
Emuluj mysz za pomocą pseudo-terminala:
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
Powyżej strona główna pty jest zakończona przez socat na nazwanym potoku ( fifo
). Łączymy to fifo z procesem (powłoką), który zapisuje 0x87 0x0a 0x00, co w protokole systemów myszy oznacza no button pressed, delta(x,y) = (10,0)
. Tutaj my (powłoka) nie emulujemy terminala, ale mysz, 3 bajty, które wysyłamy, nie są odczytywane (potencjalnie przekształcane) przez aplikację z urządzenia końcowego ( mouse
powyżej której znajduje się dowiązanie symboliczne socat
do jakiegoś /dev/pts/x
urządzenia) , ale należy je interpretować jako zdarzenie wejściowe myszy.
Utwórz interfejs 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
Powyżej przewód szeregowy jest emulowany socat
jako gniazdo TCP pomiędzy hostA a hostB. Dyscyplina linii SLIP interpretuje te bajty wymieniane przez tę linię wirtualną jako pakiety IP w obudowie SLIP do dostarczenia przez sl0
interfejs.