Do tematu: Podsystem wejścia-wyjścia

Do tematu: Struktury danych

Struktury termio i termios

  1. Znaki specjalne
  2. Kontrola parzystości
  3. Flagi wejściowe
  4. Flagi wyjściowe
  5. Flagi sterujące
  6. Flagi lokalne

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

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.

Znaki specjalne

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

Początek pliku

Flagi wejściowe

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.

Początek pliku

Flagi wyjściowe

flaga kod nazwa ang. komentarz
OPOST 0000001 output postponed Ustawiona powoduje, że znaki, przed zapisaniem do urządzenia terminalowego, są przetwarzane. Jeśli nie jest ustawiona, znaki są zapisywane bez przetwarzania. Ustawienie poniższych flag jest sprawdzane, jeśli jest ustawiona flaga OPOST.
OLCUC 0000002 lower case to upper case Jeśli jest ustawiona, to małe litery są przekształcane na wielkie.
ONLCR 0000004 new line to carriage return Ustawiona oznacza, że każdy znak nowego wiersza jest przekształcany na dwa znaki: znak powrotu karetki i znak nowego wiersza.
OCRNL 0000010 carriage return to new line Ustawiona powoduje, że znaki powrotu karetki są przekształcane na znaki nowego wiersza.
ONOCR 0000020 no carriage return Ustawiona powoduje, że znaki powrotu karetki, występujące w zerowej kolumnie wiersza, są pomijane (nie są zapisywane do urządzenia terminalowego).
ONLRET 0000040 new line return Ustawiana, gdy znak nowego wiersza powoduje automatyczny powrót karetki. Podprogram obsługi urządzenia terminalowego musi być o tym fakcie poinformowany, aby zachować poprawną numerację kolumn.
OFILL 0000100 Obecnie nieużywana.
OFDEL 0000200 Obecnie nieuż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.

Początek pliku

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

Flagi sterujące

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.

Początek pliku

Flagi lokalne

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).


Autor: Maciej Kaczmarek