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:

Operacje ioctl() dla urządzeń końcowych
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.

flagi dla pola sg_flags struktury danych sgtty
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 .