Слайд 2ЦЕЛИ РАЗДЕЛА
По завершении этого раздела вы будете способны:
описать аппаратный и
программный интерфейс терминального ввода/вывода
изменять характеристики терминального интерфейса ввода/вывода
Слайд 3ПРОГРАММНЫЙ ИНТЕРФЕЙС ВВОДА/ВЫВОДА
open(2)
/dev/term/xx
/dev/pty
/dev/tty
возвращает дескриптор файла
ioctl(2)
/usr/include/termio.h
termios(2)
/usr/include/termios.h
read(2)
write(2)
close(2)
Слайд 4ИСПОЛЬЗОВАНИЕ termios(2)
Параметры RS232
Отображение символов
Задержки и табуляции
Управление потоком
Управляющие символы
Эхо
Немедленный ввод
"Сырой" терминальный ввод/вывод
Слайд 5termios(2) - tcget/setattr
ИСПОЛЬЗОВАНИЕ
#include
int tcgetattr(int fildes,
struct termios *termios_p);
int tcsetattr(int
fildes,
int optional_actions,
const struct termios *termios_p);
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
успех - 0
неуспех - -1 и errno установлена
Слайд 6optional_actions
TCSANOW установить атрибуты немедленно
TCSADRAIN установить атрибуты после передачи содержимого буфера
вывода
TCSAFLUSH установить атрибуты после передачи вывода и сброса ввода
Слайд 7ПОРЯДОК ИЗМЕНЕНИЯ ТЕРМИНАЛЬНЫХ АТРИБУТОВ
2 struct termios tty, savetty;
3 fd =
open("/dev/tty", O_RDWR);
4 tcgetattr(fd, &tty); 5 savetty = tty;
6 /* modify struct termios tty members */
7 tcsetattr(fd, TCSANOW, &tty);
8 /* use terminal */
9 tcsetattr(fd, TCSAFLUSH, &savetty);
Слайд 8СТРУКТУРА termios
#define NCCS 19
struct termios {
tcflag_t c_iflag; /* input
modes */
tcflag_t c_oflag; /* output modes */
tcflag_t c_cflag; /* control modes*/
tcflag_t c_lflag; /* local modes */
cc_t c_cc[NCCS]; /* control chars */
};
Слайд 9Управляющие символы
индекс c_cc[индекс]
VINTR ETX (CTRL-C) в старых юниксах - DEL
VQUIT FS
(CTRL-|)
VERASE BS (CTRL-H) в старых юниксах - #
VWERASE ETB (CTRL-W)
VKILL NAK (CTRL-U) в старых юниксах - @
VEOF EOT (CTRL-D)
VSTOP DC1 (CTRL-S)
VSTART DC3 (CTRL-Q)
VSUSP EM (CTRL-Z)
VDISCARD SI (CTRL-O)
VLNEXT SYN (CTRL-V)
VREPRINT DC2 (CTRL-R)
Слайд 14НЕКАНОНИЧЕСКИЙ ВВОД
Сбросить флаг ICANON в c_lflag
Установить MIN и TIME в
соответствующие значения.
MIN ссылается на c_cc[VMIN]
TIME ссылается на c_cc[VTIME]
MIN > 0, TIME > 0 MIN символов получено или истекло межсимвольное время
MIN > 0, TIME = 0 MIN символов получено, TIME не играет роли
MIN = 0, TIME > 0 один символ получен или истекло время с момента запроса
MIN = 0, TIME = 0 возвращает управление немедленно, считываются только те символы, которые уже находятся в буфере