TERMIOS (2)





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 Fotovoltaiczne
termio
termios h (2)
module TERMIOSuppercase
termios Example
module termios

więcej podobnych podstron