Struktura termios
Do tematu: Podsystem wejścia-wyjścia
Do tematu: Struktury danych
Struktury termio i termios
Znaki specjalne
Kontrola parzystości
Flagi wejściowe
Flagi wyjściowe
Flagi sterujące
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
Wyszukiwarka
Podobne podstrony:
termios h (4)TPV Termioczne ogniwa Fotovoltaicznetermiotermios h (2)module TERMIOSuppercasetermios Examplemodule termioswięcej podobnych podstron