[<<Previous Entry]
[^^Up^^]
[Next Entry>>]
[Menu]
[About The Guide]
Передача двоичного файла - Пример
На следующей странице приведены подпрограммы для установки
терминального интерфейса в режим ввода/вывода необработанных данных
("сырой") и восстановления исходного режима. Эти подпрограммы работают
так:
8 fd присваивается 0 или 1, если setrawio вызывается получателем
(recv) или передатчиком (xmit), соответственно.
10-11 Если дескриптор файла 0 или 1 не ассоциирован с терминальным
специальным файлом, эта функция возвращает управление немедленно. Это
позволяет программе, использующей setrawio, перенаправить свой
стандартный ввод/вывод в файл или программный канал (в этом случае,
setrawio вообще не нужен). Если же дескриптор ассоциирован с
терминальным специальным файлом, то режим интерфейса переключается на
"сырой" ввод/вывод.
12-15 Для заданного дескриптора файла считывается значение
структуры termios.
16 Копия структуры termios сохраняется для восстановления режима
терминального интерфейса, который был до вызова setrawio.
17-22 Флаги в структуре termios устанавливаются для приема и
передачи произвольных восьмибитных данных. Срезание старшего бита,
отображение вводимых символов и управление потоком ввода выключены.
Размер символа установлен равным восьми битам, и выключен контроль
четности. Поиск специальных управляющих символов, канонический ввод и
эхо в поле флагов локального режима также выключены. Заметьте, что эта
функция одна и та же как для ввода, так и для вывода, так как
установки флагов для ввода не влияют на вывод, и наоборот.
23-24 Для неканонического ввода MIN устанавливается равным размеру
буфера ввода, используемого в вызове read(2). Таймер не используется,
поэтому TIME устанавливается в ноль.
25 Режим терминального интерфейса будет изменен после того, как весь
вывод будет передан, а ввод - сброшен.
32 Терминальный интерфейс возвращается в то состояние, в котором он
находился до вызова функции setrawio.
Файл: setrawio.c
Далее в этом разделе приводится специальный пример использования этих
функций.
ПЕРЕДАЧА ДВОИЧНОГО ФАЙЛА - ПРИМЕР setrawio.c
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <termios.h>
4 #include "xmit.h"
5
6 static struct termios tty, savtty;
7
8 void setrawio(int fd) /* set "raw" input/output modes */
9 {
10 if (!isatty(fd))
11 return;
12 if (tcgetattr(fd, &tty) == -1) {
13 perror("tcgetattr");
14 exit(2);
15 }
16 savtty= tty;
17 tty.c_iflag &= ~(BRKINT | ISTRIP | INLCR | ICRNL
18 | IUCLC | IXON);
19 tty.c_oflag &= ~OPOST;
20 tty.c_cflag |= CS8;
21 tty.c_cflag &= ~PARENB;
22 tty.c_lflag &= ~(ISIG | ICANON | ECHO);
23 tty.c_cc[VMIN] = BLOCKSIZE; /* MIN */
24 tty.c_cc[VTIME] = 0; /* TIME */
25 tcsetattr(fd, TCSAFLUSH, &tty);
26 }
27
28 void restorio(int fd) /* restore terminal modes */
29 {
30 if (!isatty(fd))
31 return;
32 tcsetattr(fd, TCSAFLUSH, &savtty);
33 }