Вход/Регистрация
Разработка приложений в среде Linux. Второе издание
вернуться

Троан Эрик В.

Шрифт:

Кроме того, что уже было отмечено, эти функции возвращают

0
в случае успеха и
– 1
при ошибке. Вызовы функций, которые можно использовать для управления терминалом, описаны ниже.

int tcgetattr(int fd, struct termios * t);

Восстанавливает текущие настройки файлового дескриптора

fd
и помещает их в структуру, на которую указывает t.

int tcsetattr(int fd, int options, struct termios * t);

Устанавливает текущие настройки терминала для файлового дескриптора

fd
в настройки, приведенные в
t
. Всегда используйте
tcgetattr
для заполнения
t
, затем модифицируйте его. Никогда не заполняйте
t
вручную: некоторые системы требуют установки или снятия флагов, кроме флагов, определенных POSIX, поэтому заполнение вручную является непереносимым.

Аргумент

options
определяет, когда изменения вступают в силу.

TCSANOW
Изменение немедленно вступает в силу.
TCSADRAIN
Изменение вступает в силу после того, как передаются все входные данные, уже записанные в
fd
; перед вступлением в силу оно очищает очередь. Необходимо использовать это при смене выходных параметров.
TCSAFLUSH
Изменение вступает в силу после того, как выходная очередь была очищена; входная же очередь отбрасывается перед вступлением изменений в силу.

Если система не может обработать некоторые настройки, например, скорость передачи данных, ей разрешается игнорировать их без выдачи сообщения об ошибке. Единственный способ, с помощью которого можно узнать, были ли приняты настройки — вызвать

tcgetattr
и сравнить содержимое возвращаемой им структуры с содержимым структуры, переданной
tcsetattr
.

Поэтому более переносимые приложения используют код вроде показанного ниже.

#include <termios.h>

struct termios save;

struct termios set;

struct termios new;

int fd;

...

tcgetattr(fd, &save);

set = save;

cfsetospeed(&set, B2400);

cfsetispeed(&set, B2400);

tcsetattr(fd, &set);

tcgetattr(fd, &new);

if ((cfgetospeed(&set) != B2400) ||

 (cfgetispeed(&set) != B2400)) {

 /* объяснение */

}

Обратите внимание, что если не имеет значения, "зависнет" ли настройка

termios
, лучше проигнорировать это условие, как делается в
robin
.

speed_t cfgetospeed(struct termios * t);

speed_t cfgetispeed(struct termios * t);

Извлекает скорость, соответственно, вывода или ввода из

t
. Эти функции возвращают символическую скорость, такую же, которая дается
cfsetospeed
и
cfsetispeed
.

int cfsetospeed(struct termios * t, speed_t speed);

int cfsetispeed(struct termios * t, speed_t speed);

Устанавливает, соответственно, вывода или ввода в

t
на
speed
. Обратите внимание, что эта функция не меняет скорость соединения на любом файловом дескрипторе; она просто устанавливает скорость в структуре
termios
. Скорость, как и другие характеристики, применяется к файловому дескриптору с помощью
tcsetattr
.

Эти функции принимают символическую скорость — то есть число, соответствующее определению одного из следующих макросов, имена которых определяют скорость в битах в секунду:

B0
(0 бит в секунду, определяет отключенное состояние)
B50
,
B75
,
B110
,
B134
[113] ,
B150
,
B200
,
B300
,
B600
,
B1200
,
B1800
,
B2400
,
B4800
,
B9600
,
B19200
,
B38400
,
B57600
,
B115200
,
B230400
,
B460800
,
B500000
,
B576000
,
B921600
,
B1000000
,
B1152000
,
B1500000
,
B2000000
,
B2500000
,
B3000000
,
B3500000
или
B4000000
.
B57600
и выше в POSIX не описаны; переносимые исходные коды использует их только в том случае, если они защищены операторами
#ifdef
.

113

B134
в действительности равняется 134,5 бит/с, скорость, используемая устаревшим терминалом IBM.

По мере того, как будут разрабатываться драйверы Linux для оборудования, поддерживающего другие скорости передачи данных, в заголовочный файл будут добавляться новые символические скорости.

В настоящий момент скорость ввода игнорируется. Интерфейс termios устанавливает отдельные скорости ввода и вывода для асинхронного оборудования, допускающего раздельные скорости, но такое оборудование встречается довольно редко. Просто вызовите

cfsetospeed
и
cfsetispeed
попарно, чтобы ваш код продолжил работать в системах, поддерживающих раздельные скорости.

  • Читать дальше
  • 1
  • ...
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: