Do tematu: Podsystem wejścia-wyjścia
Do tematu: Struktury danych
Struktury termio i termios służą do przechowywania informacji związanych z urządzeniami terminalowymi. Informacje te wykorzystywane są przez sterowniki oraz dyscyplinę linii N_TTY. Kilkadziesiąt flag pozwala określić w jaki sposób i czy w ogóle przetwarzać znaki odbierane lub przesyłane do urządzenia, jaka jest szybkość transmisji danych, jak traktować znaki specjalne itd.
W polach c_iflag, c_oflag, c_cflag, c_lflag ustawiane, bądź zerowane są bity odpowiadające flagom odpowiednio wejściowym, wyjściowym, sterującym i lokalnym.
Kod flag zapisany jest w systemie ósemkowym.
Zwykle w sterowniku urządzenia terminalowego jest zdefiniowana funkcja, która nadaje wartości początkowe polom struktury termios. Procesy mogą zmieniać te wartości za pomocą funkcji systemowej ioctl.
Obie struktury są niemal identyczne. Różnią się tylko rozmiarami pól. W nowych wersjach systemu Linux używana jest prawie wyłącznie struktura termios.
W pliku /include/asm-i386/termios.h zdefiniowane są funkcje konwersji z termio na termios i z termios na termio.
Struktura termios oraz flagi są zdefiniowane w pliku /include/asm-i386/termbits.h, struktura termio natomiast w pliku /include/asm-i386/termios.h.
struct termio
#define NCC 8
typ | nazwa pola |
unsigned short | c_iflag |
unsigned short | c_oflag |
unsigned short | c_cflag |
unsigned short | c_lflag |
unsigned char | c_line |
unsigned char | c_cc[NCC] |
struct termios
typedef unsigned char cc_t;
typedef unsigned int speed_t;
typedef unsigned int tcflag_t;
#define NCCS 19
typ | nazwa pola | opis |
tcflag_t | c_iflag | Flagi wejściowe. Definiują sposób przetwarzania znaków otrzymanych od urządzenia. |
tcflag_t | c_oflag | Flagi wyjściowe. Przede wszystkim, określają sposób traktowania znaków wysyłanych do urządzenia. |
tcflag_t | c_cflag | Flagi sterujące. Definiują techniczne parametry pracy urządzenia terminalowego. |
tcflag_t | c_lflag | Flagi lokalne. Określają tryb działania dyscypliny linii, tzn. czy znaki nadchodzące z urządzenia układać w wiersze i czy wyświetlać ich echo, a jeśli tak, to w jaki sposób. |
cc_t | c_line | Pole c_line służy do zapamiętania rodzaju dyscypliny linii, związanej z danym urządzeniem terminalowym. |
cc_t | c_cc[NCCS] | W tablicy c_cc pamiętane są znaki specjalne, nazywane też znakami sterującymi. Każdemu znakowi specjalnemu przypisany jest indeks tablicy c_cc. Pod tym indeksem znajduje się ósemkowy kod znaku. Np. znak końca pliku (EOF) ma zazwyczaj przypisany indeks 4 oraz kod \004, czyli c_cc[4] = \004. |
Zanim przedstawione zostanie znaczenie znaków specjalnych i flag, warto wyjaśnić jedno ważne pojęcia. Jest to kontrola parzystości.
Kontrola parzystości dotyczy słów binarnych. Są dwa rodzaje kontroli parzystości: parzysta i nieparzysta. W przypadku parzystej kontroli parzystości wymagane jest, aby liczba jedynek w każdym słowie była parzysta. Jeśli stosowana jest nieparzysta kontrola parzystości, liczba jedynek musi być nieparzysta.
Kontrolę parzystości stosuje się np. do wykrywania błędów transmisji danych. Załóżmy, że znaki reprezentowane są w kodzie ASCII i że urządzenie przesyła jeden bajt informacji na każdy znak. Na reprezentację znaku potrzebnych jest siedem bitów. Ósmy bit, w zależności od znaku i kontroli parzystości, jest ustawiany albo zerowany. Jeśli kontrola parzystości jest parzysta (nieparzysta), to urządzenie dopasowuje wartość ósmego bitu tak, aby suma jedynek w całym bajcie była parzysta (nieparzysta). Dla każdego otrzymanego bajtu, komputer wykonuje kontrolę parzystości. W przypadku wykrycia błędu, sygnalizowany jest błąd kontroli parzystości.
znak | kod | nazwa ang. | sekw. klawiszy | nazwa polska | komentarz |
VINTR | 0 | interrupt | ^C | znak przerwania | Znaki te mają specjalne znaczenie, gdy ustawiona jest flaga ISIG . |
VQUIT | 1 | quit | ^\ | znak końca pracy | |
VERASE | 2 | erase | del | znak ścierający | Mają specjalne znaczenie, gdy ustawiona jest flaga ICANON . |
VKILL | 3 | kill line | ^U | znak kasowania wiersza | |
VEOF | 4 | end of file | ^D | znak końca pliku | |
VTIME | 5 | time | \0 | Znaki te nabierają znaczenia, gdy flaga ICANON jest wyzerowana. Przysłane przez urządzenie terminalowe znaki stają się dostępne, gdy długość kolejki wejściowej osiągnie wartość c_cc[VMIN] lub po upływie c_cc[VTIME] dziesiątych części sekundy czasu od ostatniej operacji czytania. | |
VMIN | 6 | minimum | \1 | ||
VSWTC | 7 | switch | \0 | Obecnie nieużywany | |
VSTART | 8 | start | ^Q | znak wznawiający wypisywanie danych na terminalu, nazywany znakiem rozpoczęcia | Mają specjalne znaczenie, jeśli jest ustawiona flaga IXON lub IXOFF . |
VSTOP | 9 | stop | ^S | znak wstrzymujący wypisywanie danych na terminalu, nazywany znakiem zatrzymania | |
VSUSP | 10 | suspend | ^Z | znak zawieszenia | Posiada specjalne znaczenie, gdy jest ustawiona flaga ISIG . |
VEOL | 11 | end of line | \0 | znak końca wiersza | Ma specjalne znaczenie, jeśli jest ustawiona flaga ICANON . |
VREPRINT | 12 | reprint | ^R | znak powtórnego wypisania ostatniego wiersza | Specjalne znaczenie ma tylko, gdy ustawione są flagi ICANON oraz IEXTEN . |
VDISCARD | 13 | discard | ^U | Obecnie nieużywany | |
VWERASE | 14 | word erase | ^W | znak kasowania słowa | Mają specjalne znaczenie, gdy ustawione
są flagi ICANON oraz IEXTEN.
Po nadejściu znaku VLNEXT pole bitowe lnext w strukturze tty_struct otrzymuje wartość 1. Oznacza to, że następny znak, nawet jeśli będzie znakiem specjalnym, zostanie przez dyscyplinę linii przetworzony tylko w pewnym niewielkim stopniu. Nazwa sugeruje, że następny znak w ogóle nie powinien być przetwarzany, co w przypadku dyscypliny linii N_TTY nie jest prawdą. |
VLNEXT | 15 | literal next | ^V | ||
VEOL2 | 16 | end of line 2 | \0 | znak końca wiersza 2 |
flaga | kod | nazwa ang. | komentarz |
IGNBRK | 0000001 | ignore break | Ustawienie powoduje, że znak przerwania (^C) jest ignorowany. |
BRKINT | 0000002 | break interrupt | Jeśli jest ustawiona, to w przypadku nadejścia znaku przerwania (^C), do grupy terminalowej, której terminalem sterującym jest dane urządzenie terminalowe, jest wysyłany sygnał SIGINT. |
IGNPAR | 0000004 | ignore parity | Ustawienie oznacza, że znaki, które spowodowały błąd kontroli parzystości są pomijane. |
PARMRK | 0000010 | parity mark | Określa sposób informowania o znakach , które spowodowały błąd kontroli parzystości. Ustawiona powoduje, że niepoprawne znaki są poprzedzane dwoma znakami: \0377 oraz \0. Jeśli nie jest ustawiona, to los znaków, które spowodowały błąd kontroli parzystości zależy od flagi INPCK. Sprawdzanie ustawienia flag PARMRK i INPCK ma sens tylko wówczas, gdy nie jest ustawiona flaga IGNPAR. |
INPCK | 0000020 | parity check | Ustawienie powoduje, że znaki, które spowodowały błąd kontroli parzystości są przekształcane na znak \0. Jeśli obie flagi PARMRK oraz INPCK nie są ustawione, to niepoprawne znaki są akceptowane, tzn. umieszczane w buforze znaków wejściowych. |
ISTRIP | 0000040 | strip | Ustawienie powoduje, że po wykonaniu kontroli parzystości długość znaków jest zmniejszana do siedmiu bitów. Dokładniej: zerowany jest ósmy, najbardziej znaczący bit znaku. |
INLCR | 0000100 | new line to carriage return | Ustawienie spowoduje przekształcenie każdego znaku nowej linii (\n) na znak powrotu karetki (\r). |
IGNCR | 0000200 | ignore carriage return | Ustawienie spowoduje ignorowanie znaku powrotu karetki (\r). |
ICRNL | 0000400 | carriage return to new line | Ustawienie spowoduje przekształcenie każdego znaku powrotu karetki (\r) na znak nowej linii (\n). |
IUCLC | 0001000 | upper case to lower case | Jeśli jest ustawiona oraz ustawiona jest flaga IEXTEN , to wielkie litery, przeczytane z urządzenia terminalowego, są przekształcane na małe. |
IXON | 0002000 | Ustawiona oznacza, że użytkownik ma możliwość sterowania wypisywaniem znaków na terminalu. Naciśnięcie klawiszy Ctrl+S powoduje wstrzymanie wypisywania, Ctrl+Q wznowienie. Jeśli flaga ta nie jest ustawiona, to powyższe kombinacje klawiszy nie mają specjalnego znaczenia. | |
IXANY | 0004000 | Jeśli jest ustawiona, to wznowienie wypisywania znaków na terminalu następuje po naciśnięciu dowolnego klawisza. Testowanie wartości tej flagi ma sens tylko wtedy, gdy ustawiona jest flaga IXON. | |
IXOFF | 0010000 | Ustawiona powoduje, że w przypadku przepełnienia kolejki wejściowej, do urządzenia terminalowego jest wysyłany znak VSTOP, wstrzymujący wprowadzanie danych wejściowych. Po pobraniu przez procesy znaków z kolejki, wysyłany jest znak VSTART , informujący o możliwości wznowienia transmisji danych. | |
IMAXBEL | 0020000 | Jeśli jest ustawiona, to w momencie przepełnienia wejściowej kolejki znaków, zostaje włączony sygnał dźwiękowy. Obecnie nie jest używana. |
Niektóre urządzenia terminalowe wymagają pewnego czasu na wykonanie określonych ruchów, takich jak np. zmiana wiersza czy powrót karetki. Następujące flagi służą do określenia związanych z tym opóźnień. Flagi te, nie są jednak obecnie używane.
flaga | kod | nazwa ang. | komentarz |
NLDLY | 0000400 | new line delay | Ustawiona oznacza, że jest zdefiniowane opóźnienie przy przejściu do nowego wiersza. |
NL0 | 0000000 | new line ... | Określają opóźnienie przy przejściu do nowego wiersza. |
NL1 | 0000400 | ||
CRDLY | 0003000 | carriage return delay | Służy do wykrywania wartości czterech poniższych flag. |
CR0 | 0000000 | carriage return ... | Określają opóźnienie przy wykonaniu powrotu karetki |
CR1 | 0001000 | ||
CR2 | 0002000 | ||
CR3 | 0003000 | ||
TABDLY | 0014000 | tabulation delay | Służy do wykrywania wartości czterech poniższych flag. |
TAB0 | 0000000 | tabulation ... | Określają opóźnienie przy wykonaniu znaku tabulacji poziomej. |
TAB1 | 0004000 | ||
TAB2 | 0010000 | ||
TAB3 | 0014000 | ||
XTABS | 0014000 | exchange tabulation to spaces | Jeśli jest ustawiona, to zamiast znaku tabulacji, do urządzenia terminalowego jest zapisywany ciąg spacji. |
BSDLY | 0020000 | Ustawiona oznacza, że jest zdefiniowane opóźnienie przy usuwaniu ostatniego znaku. | |
BS0 | 0000000 | Określają opóźnienie przy usuwaniu ostatniego znaku. | |
BS1 | 0020000 | ||
VTDLY | 0040000 | vertical tabulation delay | Ustawiona oznacza, że jest zdefiniowane opóźnienie przy wykonywaniu (wypisywaniu) znaku tabulacji pionowej. |
VT0 | 000000 | vertical tabulation ... | Określają opóźnienie przy wykonaniu znaku tabulacji pionowej. |
VT1 | 0040000 | ||
FFDLY | 0100000 | Ustawiona oznacza, że jest zdefiniowane opóźnienie przy zmianie strony. | |
FF0 | 0000000 | Określają opóźnienie przy zmianie strony. | |
FF1 | 0100000 |
flaga | kod | nazwa ang. | komentarz |
CBAUD | 0010017 | control baud | Służy do wykrywania ustawienia flag określających szybkość transmisji danych. |
B0 | 0000000 | baud ... | Określają szybkość transmisji danych. Szybkość 0 bodów oznacza, że urządzenie terminalowe jest zawieszone (ang. hung up). |
B50 | 0000001 | ||
B75 | 0000002 | ||
B110 | 0000003 | ||
B134 | 0000004 | ||
B150 | 0000005 | ||
B200 | 0000006 | ||
B300 | 0000007 | ||
B600 | 0000010 | ||
B1200 | 0000011 | ||
B1800 | 0000012 | ||
B2400 | 0000013 | ||
B4800 | 0000014 | ||
B9600 | 0000015 | ||
B19200 | 0000016 | ||
B38400 | 0000017 | ||
EXTA | B19200 | extension ... | |
EXTB | B38400 | ||
CSIZE | 0000060 | char size | Służy do wykrywania ustawienia czterech poniższych flag. |
CS5 | 0000000 | char size ... | Służą do określenia rozmiaru znaku (rozmiar domyślny osiem bitów). |
CS6 | 0000020 | ||
CS7 | 0000040 | ||
CS8 | 0000060 | ||
CSTOPB | 0000100 | stop bits | Jeśli jest ustawiona, znak stop ma długość dwóch bitów, jeśli nie jest ustawiona, jednego bitu. |
CREAD | 0000200 | control read | Charakteryzuje stan odbiorcy. Jeśli jest ustawiona, to czytanie znaków z urządzenia terminalowego jest możliwe. Jeśli nie jest ustawiona, nie można przyjmować danych. |
PARENB | 0000400 | parity enable | Ustawiona oznacza, że aktywna jest kontrola parzystości . |
PARODD | 0001000 | parity odd | Ustawiona informuje, że kontrola parzystości jest nieparzysta. Jeśli nie jest ustawiona, to kontrola parzystości jest parzysta. Testowanie ustawienia flagi PARODD ma sens tylko wtedy, gdy ustawiona jest flaga PARENB. |
HUPCL | 0002000 | hang up closing last (hang up on last close) | Jeśli jest ustawiona, to po zamknięciu urządzenia terminalowego przez ostatni proces, urządzenie to zostaje zawieszone (np. wprowadzone w stan minimalnego poboru energii). |
CLOCAL | 0004000 | control local | Związana z modemami i czytnikami CD-ROM. |
CBAUDEX | 0010000 | baud extension | Ustawiona informuje o tym, że są zdefiniowane duże szybkości transmisji danych. |
B57600 | 0010001 | baud ... | Dodatkowe flagi określające szybkość transmisji danych. |
B115200 | 0010002 | ||
B230400 | 0010003 | ||
B460800 | 0010004 | ||
CIBAUD | 002003600000 | input baud rate | Obecnie nieużywana. |
CRTSCTS | 020000000000 | Ustawiona oznacza, że jest dostępna sprzętowa kontrola przepływu danych. |
flaga | kod | nazwa ang. | komentarz |
ISIG | 0000001 | interrupt signal | Jeśli jest ustawiona, to po nadejściu znaku przerywającego, do grupy terminalowej, której terminalem sterującym jest dane urządzenie terminalowe, wysyłany jest odpowiedni sygnał. Dyscyplina linii N_TTY obsługuje trzy znaki przerywające: znak przerwania ( VINTR ), znak końca pracy ( VQUIT ), znak zawieszenia ( VSUSP ). Wysyłane sygnały to odpowiednio: SIGINT, SIGQUIT, SIGTSTP. Jeśli flaga ISIG nie jest ustawiona, sygnały nie są generowane. |
ICANON | 0000002 | Jeśli jest ustawiona, to nadchodzące znaki są przez dyscyplinę linii układane w wiersze. Nabierają wówczas znaczenia znaki ścierające, znak nowego wiersza, końca wiersza oraz końca pliku (patrz znaki specjalne). | |
XCASE | 0000004 | Obecnie nieużywana | |
ECHO | 0000010 | echo | Jeśli jest ustawiona, to wypisywane jest na terminalu echo wprowadzanych znaków. Jeśli jest wyzerowana, to echo nie jest wypisywane. Sytuacją, w której zeruje się flage ECHO, jest np. wprowadzanie przez użytkownika hasła. |
ECHOE | 0000020 | echo erase | Jeśli jest ustawiona, to echem znaku ścierającego jest sekwencja znaków: \b, ' ', \b, czyli cofnięcie, spacja, cofnięcie. Efektem wizualnym takiego ciągu znaków jest wymazanie, na ekranie monitora, usuwanego znaku. |
ECHOK | 0000040 | echo kill line | Jeśli jest ustawiona, to echem znaku kasowania wiersza jest znak nowego wiersza lub, w przypadku ustawienia flagi ONLCR, znaki powrotu karetki i nowego wiersza. |
ECHONL | 0000100 | echo new line | Ustawiona oznacza, że echem znaku nowego wiersza jest znak nowego wiersza lub, w przypadku ustawienia flagi ONLCR, znaki powrotu karetki i nowego wiersza. Jest tak nawet wówczas, gdy flaga ECHO jest wyzerowana. |
NOFLSH | 0000200 | no flush | Jeśli nie jest ustawiona, to po nadejściu znaku przerywającego i po wygenerowaniu związanego z nim sygnału (patrz flaga ISIG), bufor znaków zostaje opróżniony, tzn. wszystkie znaki, które czekają na wysłanie do urządzenia terminalowego, są wysyłane lub tylko usuwane z bufora. Zależy to od funkcji flush_buffer, którą dostarcza sterownik urządzenia. Ustawienie flagi NOFLSH powoduje, że po wysłaniu sygnału, bufor nie jest opróżniany. |
TOSTOP | 0000400 | Jeśli jest ustawiona, to możliwość pisania do urządzenia terminalowego, mają tylko procesy, których terminalem sterującym jest to urządzenie i które należą do grupy terminalowej tego urządzenia. Ograniczenie to nie dotyczy bieżącej konsoli. Jeśli próbuje pisać proces nie spełniający powyższych kryteriów, to do grupy tego procesu wysyłany jest sygnał SIGTTOU, a operacja pisania kończy się błędem. Proces, jednak, może sygnał ten zignorować. Wówczas operacja pisania zostanie umożliwiona. | |
ECHOCTL | 0001000 | echo control characters | Ustawiona powoduje, że wypisywane jest na terminalu echo znaków sterujących. Jeśli nie jest ustawiona, to echo znaków sterujących nie jest wypisywane. Ustawienie flagi ECHO nie zapewnia wypisywania echa znaków sterujących. |
ECHOPRT | 0002000 | Jeśli jest ustawiona, to znaki, usuwane przez któryś ze znaków ścierających, są wypisywane na terminalu. Są one poprzedzane znakiem specjalnym \\ (backslash). Po ostatnim usuwanym znaku wypisywany jest znak / (slash). | |
ECHOKE | 0004000 | echo kill line erase | Ustawienie flagi ECHOKE ma sens, jeśli ustawione są flagi ECHOE i ECHOK. Jeśli flaga ECHOKE jest ustawiona, to echem znaku kasowania wiersza jest taka kombinacja znaków cofnięcia i spacji, która spowoduje wymazanie, na ekranie monitora, kasowanego wiersza. |
FLUSHO | 0010000 | Obecnie nieużywana | |
PENDIN | 0040000 | pending | Obecnie nieużywana |
IEXTEN | 0100000 | input extension | Jeśli jest ustawiona, to stają się dostępne pewne dodatkowe możliwości sterowania pracą dyscypliny linii. Najważniejszym rozszerzeniem jest rozpoznawanie czterech znaków sterujacych, które przy wyzerowanej fladze IEXTEN nie mają specjalnego znaczenia. Są to następujące znaki: kasowania słowa (VWERASE), (VLNEXT), końca wiersza 2 (VEOL2), powtórnego wypisania ostatniego wiersza (VREPRINT). |