[<<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 }