Siódma edycja interfejsu terminala Unix
Interfejs terminala Seventh Edition Unix to uogólniona abstrakcja, obejmująca zarówno interfejs programowania aplikacji dla programów, jak i zestaw oczekiwań behawioralnych dla użytkowników, terminala dostępnego historycznie w Seventh Edition Unix . Został on w dużej mierze zastąpiony przez interfejs terminala POSIX .
Pojęcia i przegląd
Interfejs terminala dostarczony przez Seventh Edition Unix i UNIX/32V , a także przedstawiony przez BSD w wersji 4 jako stary sterownik terminala , był prosty, w dużej mierze nastawiony na dalekopisy jako terminale. Dane wejściowe wprowadzano wiersz po wierszu, a sterownik terminala w systemie operacyjnym (a nie same terminale) zapewniał proste możliwości edycji wierszy. Jądro utrzymywało bufor, w którym odbywała się edycja. Aplikacje odczytujące wejście terminala otrzymywałyby zawartość bufora dopiero po powrocie naciśnięto klawisz na terminalu, aby zakończyć edycję linii. Klawisz @ wysłany z terminala do systemu wymazałby („zabił”) całą bieżącą zawartość bufora edycyjnego i byłby normalnie wyświetlany jako symbol „ @ ”, po którym następuje sekwencja nowej linii, aby przenieść pozycję drukowania do nowej pusta linia. Klawisz # wysłany z terminala do systemu wymazałby ostatni znak z końca bufora edycyjnego i normalnie byłby wyświetlany jako ' # symbol ', który użytkownicy musieliby rozpoznać jako oznaczający „wytarcie” poprzedzającego znaku (dalekopisy nie są fizycznie zdolne do wymazania znaków po ich wydrukowaniu na papierze).
Z programistycznego punktu widzenia urządzenie końcowe miało szybkość transmisji i odbioru , znaki „wymaż” i „zabij” (które wykonywały edycję linii, jak wyjaśniono), znaki „przerwania” i „zakończenia” (generowanie sygnałów do wszystkich procesy, dla których terminal był terminalem sterującym), znaki „start” i „stop” (używane do sterowania przepływem oprogramowania ), znak „końca pliku” (działający jak powrót karetki, z wyjątkiem usunięcia z bufora przez read ()
wywołanie systemowe i tym samym potencjalnie powodujące zwrócenie wyniku o zerowej długości) oraz różne flagi trybu określające, czy lokalne echo było emulowane przez sterownik terminala jądra, czy włączono sterowanie przepływem modemu, długości różnych opóźnień wyjściowych, mapowanie powrotu karetki znak i trzy tryby wprowadzania.
Tryby wprowadzania
Trzy tryby wprowadzania danych dla terminali w Seventh Edition Unix to:
- tryb liniowy (nazywany również trybem „gotowym”)
- W trybie liniowym dyscyplina liniowa realizuje wszystkie funkcje edycji linii oraz rozpoznaje znaki sterujące „przerwanie” i „wyjdź” i przetwarza je na sygnały wysyłane do procesów. Programy aplikacji czytające z terminala otrzymują całe wiersze, po zakończeniu edycji wiersza przez naciśnięcie przez użytkownika przycisku powrotu.
- tryb cbreak
- Tryb cbreak jest jednym z dwóch trybów znakowania w czasie. ( Stephen R. Bourne żartobliwie odniósł się do tego ( Bourne 1983 , P. 288) jako tryb „na wpół ugotowany”, a zatem „rzadki”.) Dyscyplina wiersza nie wykonuje edycji wiersza, a sekwencje sterujące funkcjami edycji wiersza są traktowane jako normalne wprowadzanie znaków. Programy aplikacji czytające z terminala otrzymują znaki natychmiast, gdy tylko znajdą się w kolejce wejściowej do odczytu. Jednak znaki sterujące „przerwanie” i „wyjdź”, a także znaki sterujące przepływem modemu są nadal obsługiwane w specjalny sposób i usuwane ze strumienia wejściowego.
- surowy tryb
- tryb surowy to drugi z dwóch trybów znakowania na raz. Dyscyplina linii nie wykonuje edycji linii, a sekwencje sterujące dla obu funkcji edycji linii i różnych znaków specjalnych („przerwanie”, „zakończenie” i sterowanie przepływem) są traktowane jako normalne wprowadzanie znaków. Programy aplikacji czytające z terminala odbierają znaki natychmiast i odbierają cały strumień znaków w niezmienionej postaci, tak jak pochodził z samego urządzenia końcowego.
W interfejsie terminala POSIX te tryby zostały zastąpione przez system tylko dwóch trybów wprowadzania: kanoniczny i niekanoniczny . Obsługa znaków specjalnych generujących sygnał w interfejsie terminala POSIX jest niezależna od trybu wprowadzania i można ją oddzielnie kontrolować.
Terminale sterujące
W Seventh Edition Unix nie było kontroli zadań terminala , a grupa procesów była uważana za inną niż obecnie.
Każdy proces w systemie miał albo jeden terminal kontrolny , albo nie miał go wcale. Proces dziedziczy kontrolujący terminal od swojego rodzica. Terminal sterujący został uzyskany, gdy proces bez terminala sterującego open()
jest plikiem urządzenia końcowego, które nie jest jeszcze terminalem sterującym dla innego procesu. Wszystkie procesy, które miały ten sam terminal sterujący, były częścią jednej grupy procesów .
Interfejs aplikacji do programowania
Interfejsem programistycznym do odpytywania i modyfikowania wszystkich tych trybów i znaków sterujących było wywołanie systemowe ioctl()
. (Zastąpiło to stty()
i gtty()
w Sixth Edition Unix.) Chociaż znaki „erase” i „kill” można było modyfikować z ich domyślnych wartości # i @ , przez wiele lat bezwładność rozwojowa Seventh Edition oznaczała, że były to wstępnie ustawione wartości domyślne w sterownikach urządzeń końcowych, a w wielu systemach Unix, które zmieniały ustawienia urządzeń końcowych tylko w ramach procesu logowania, w systemowych skryptach logowania, które działały po użytkownik wprowadził nazwę użytkownika i hasło, wszelkie błędy w monitach o login i hasło musiały zostać poprawione przy użyciu historycznych kluczowych znaków edycyjnych odziedziczonych z terminali dalekopisowych.
sgtty.h
zdefiniowano stałe symboliczne, których wartości zostały ustalone i zdefiniowane, oraz definicje struktury danych interfejsu programistycznego .
operacje ioctl().
ioctl ()
były następujące:
symbol | struktura wskazywana przez trzeci argument | opis |
---|---|---|
TIOGETP |
Sgttyb |
zapytanie parametrów terminala do struktury danych |
TIOSETP |
Sgttyb |
ustaw parametry terminala ze struktury danych, opróżniając najpierw wszystkie oczekujące wyjścia i opróżniając wejścia w kolejce |
TIOSETN |
Sgttyb |
ustawić parametry terminala ze struktury danych, bez czekania lub opróżniania |
TIOCEXCL |
nic | włączyć tryb „użytkowania na wyłączność”. |
TIOCNXCL |
nic | wyłączyć tryb „użytkowania na wyłączność”. |
TIOCHPCL |
nic | włącz tryb „rozłącz się przy ostatnim zamknięciu”. |
TIOCFLUSH |
nic | opróżnij wszystkie kolejki wyjściowe i wejściowe |
TIOGETC |
cary |
zapytanie parametrów terminala do struktury danych |
TIOSETC |
cary |
ustawić parametry terminala ze struktury danych |
Struktura danych sgttyb
Jedną ze struktur danych używaną przez wywołania systemowe terminali jest struktura sgttyb
, której definicja języka programowania C jest następująca:
struct sgttyb { char sg_ispeed ; // Wpisz prędkość char sg_ospeed ; // Szybkość wyjściowa char sg_erase ; // Usuń znak char sg_kill ; // Zabij postać char sg_flags ; // Flagi kontrolne } ;
W przeciwieństwie do interfejsu terminala POSIX, interfejs terminala Seventh Edition Unix rejestrował wejściowe i wyjściowe szybkości transmisji bezpośrednio w strukturze danych.
Prędkości wejściowe i wyjściowe w polach sg_ispeed
i sg_ospeed
były prędkościami DEC DH-11 i były liczbami od 0 do 15, reprezentowanymi przez stałe symboliczne (w porządku rosnącym) B0
, B50
, B75
, B110
, B134
, B150
, B200
, B300
, B600
, B1200
, B1800
, B2400
, B4800
, B9600
, EXTA
i EXTB
, gdzie szybkość transmisji była taka jak w nazwie (dwa ostatnie to „zewnętrzny A” i „zewnętrzny B”). Ustawienie zerowej szybkości transmisji zmuszało sterownik terminala do zawieszenia modemu (jeśli terminal był urządzeniem modemowym).
Pola sg_erase
i sg_kill
były po prostu wartościami odpowiednio znaków „erase” i „kill”, domyślnie wartościami (ASCII) odpowiednio dla „ # ” i „ @ ”.
sg_flags określało różne flagi kontrolne wejścia i
wyjścia, jak w poniższej tabeli.
symbol | wartość ósemkowa | opis |
---|---|---|
OPÓŹNIENIE |
0100000 | opóźnienie podczas pisania znaków BS |
BS0 |
0000000 | |
BS1 |
0100000 | |
OPÓŹNIENIE |
0040000 | opóźnienie podczas pisania znaków VT i FF |
FF0 |
0000000 | |
FF1 |
0040000 | |
CRDELAY |
0030000 | opóźnienie podczas pisania znaków CR |
CR0 |
0000000 | |
CR1 |
0010000 | |
CR2 |
0020000 | |
CR3 |
0030000 | |
OPÓŹNIENIE |
0006000 |
opóźnienie podczas zapisywania znaków TAB XTABS technicznie nie określa opóźnienia, ale raczej powoduje, że znaki tabulacji są konwertowane na sekwencje jednego lub więcej znaków spacji. |
TAB0 |
0000000 | |
TAB1 |
00002000 | |
TAB2 |
0004000 | |
XTAB |
0006000 | |
NLDOPÓŹNIENIE |
0001400 | opóźnienie podczas pisania znaków LF |
NL0 |
0000000 | |
NL1 |
00000400 | |
NL2 |
0001000 | |
NL3 |
0001400 | |
NAWET |
0000200 | nawet parytet |
ODDP |
0000100 | dziwny parytet |
SUROWY |
0000040 | trybie „surowym”. |
CRMOD |
0000020 | tryb mapowania powrotu karetki ( CR mapuje na LF na wejściu, a zarówno CR , jak i LF są zamieniane na CR + LF na wyjściu) |
ECHO |
0000010 | lokalna emulacja echa przez sterownik terminala |
LCASE |
0000004 | mapuj wielkie litery na małe na wejściu |
CBREAK |
0000002 | tryb „cbreak”. |
TANDEM |
0000001 | włączyć kontrolę przepływu modemu |
Struktura danych
tchars
Jedną ze struktur danych używaną przez wywołania systemowe terminali jest struktura tchars
, której definicja języka programowania C jest następująca:
struct tchars { char t_intrc ; // Przerwanie char t_quitc ; // Zakończ char t_startc ; // Rozpocznij znak t_stopc ; // Zatrzymaj znak t_eofc ; // Koniec pliku char t_brkc ; // Break (alternatywa dla stałego znaku LF z tym samym skutkiem) } ;
Wartości tych pól były wartościami różnych programowo konfigurowalnych znaków specjalnych. Wartość -1 w dowolnym polu uniemożliwiała jego rozpoznanie przez sterownik terminala.
Bibliografia
- Bourne, Stephen R. (1983). systemu UNIX . Międzynarodowa seria informatyczna. Addison-Wesley. ISBN 978-0-201-13791-0 .
- Chrześcijanin, Kaare (1988). System operacyjny UNIX (wyd. 2). John Wiley & Synowie. ISBN 978-0-471-84781-6 .
- Leffler, Samuel J.; McKusick, Marshall Kirk ; Karels, Michael J.; Kwatermistrz, John S. (1989). „Obsługa terminali”. Projektowanie i wdrażanie systemu operacyjnego UNIX 4.3BSD . Seria Addisona-Wesleya w informatyce. Addison-Wesley. ISBN 978-0-201-06196-3 .
- Zlotnick, Fred (1991). „Kontrolowanie urządzeń końcowych”. Standard POSIX.1: przewodnik programisty . Pub Benjamina/Cummingsa. Co ISBN 978-0-8053-9605-8 .