Чтение онлайн

на главную - закладки

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

113: }

114: endutent;

115: }

116:

117: int main(int argc, const char **argv) {

118: char * id = NULL, *line = NULL;

119: int show_utmp = 1, show_wtmp = 0;

120: int c;

121: poptContext optCon;

122: struct poptOption optionsTable[] = {

123: {"utmp", 'u', POPT_ARG_NONE|POPT_ARGFLAG_XOR,

124: &show_utmp, 0,

125: "переключить
просмотр содержимого файла utmp", NULL},

126: { "wtmp", 'w', POPT_ARG_NONE | POPT_ARGFLAG_XOR,

127: &show_wtmp, 0,

128: "переключить просмотр содержимого файла wtmp", NULL},

129: {"id", 'i', POPT_ARG_STRING, &id, 0,

130: "показать записи процесса для заданного идентификатора inittab",

131: "<inittab id>" },

132: {"line", 'l', POPT_ARG_STRING, &line, 0,

133: "показать записи процесса для заданной строки устройства",

134: "<line>" },

135: POPT_AUTOHELP

136: POPT_TABLEEND

137: };

138:

139: optCon = poptGetContext("utmp", argc, argv, optionsTable, 0);

140: if ((c = poptGetNextOpt(optCon)) < -1) {

141: fprintf(stderr, "%s:%s\n",

142: poptBadOption(optCon, POPT_BADOPTION_NOALIAS),

143: poptStrerror(c));

144: return 1;

145: }

146: poptFreeContext(optCon);

147:

148: if (id && line)

149: fprintf(stderr, "Невозможно выбирать сразу по идентификатору и строке,"

150: "выбор по строке\n");

151:

152: if (show_utmp)

153: print_file(_PATH_UTMP, id, line);

154: if (show_utmp && show_wtmp)

155: printf("\n\n\n");

156: if (show_wtmp)

157: print_file(_PATH_WTMP, id, line);

158:

159: return 0;

160: }

16.2. Обзор

termios

Все манипуляции tty осуществляются с помощью одной структуры,

struct termios
, а также нескольких функций, определенных в заголовочном файле
<termios.h>
. Из этих функций широко применяются только шесть. Когда не нужно устанавливать скорость передачи данных по линии, используются только две наиболее важных функции —
tcgetattr
и
tcsetattr
.

#include <termios.h>

struct termios {

 tcflag_t c_iflag; /* флаги режима ввода */

 tcflag_t c_oflag; /* флаги режима вывода */

 tcflag_t c_cflag; /* флаги управляющего режима */

 tcflag_t c_lflag; /* флаги локального режима */

 cc_t c_line; /* дисциплина
линии связи */

 cc_t c_cc[NCCS]; /* управляющие символы */

};

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

int tcsetattr(int fd, int oact, struct termios * tp);

Почти в каждом случае программы должны использовать

tcgetattr
для получения текущих установок устройства, модифицировать эти установки, а затем применять
tcsetattr
для активизации модифицированных установок. Многие программы также сохраняют копии оригинальных установок и восстанавливают их перед завершением. В общем случае, следует модифицировать только интересующие вас установки; изменение других установок может усложнить работу пользователей с необычными системными конфигурациями (или сбоями в вашем коде).

Вызов

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

Для получения установок устройства tty необходимо открыть устройство и передать файловый дескриптор

tcgetattr
. Это вызывает проблемы с некоторыми устройствами tty; некоторые обычно можно открыть лишь один раз с целью предотвращения конфликта устройств. К счастью, передача флага
O_NONBLOCK
в
open
вызывает его немедленное открытие и предотвращает блокирование любых операций. Однако все равно можно предпочесть блокирование
read
; в таком случае используйте
fcntl
для отключения режима
O_NONBLOCK
перед тем, как появится возможность читать или записывать в него.

fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) & ~O_NONBLOCK);

Четыре флага

termios
контролируют четыре отдельных части управления вводом и выводом. Флаг входных данных,
с_iflag
, определяет, каким образом интерпретируются и обрабатываются принятые символы. Флаг выходных данных,
c_oflag
, определяет, каким образом интерпретируются и обрабатываются символы, записываемые вашим процессом в tty. Управляющий флаг,
c_cflag
, определяет характеристики последовательного протокола устройства и полезен лишь для физических устройств. Локальный флаг,
c_lflag
, определяет, каким образом символы собираются и обрабатываются перед отправкой на обработку выходных данных. На рис. 16.1 показана упрощенная схема того, какое место занимает каждый флаг в общей схеме обработки символов.

Рис. 16.1. Упрощенная схема обработки tty

Сначала мы продемонстрируем способы применения

termios
, а затем представим короткую справку о нем.

16.3. Примеры использования

termios

16.3.1. Пароли

Самой распространенной причиной модификации установок

termios
является чтение пароля без эхо-контроля символов. Для этого следует отключить локальное эхо во время чтения пароля. Ваш код должен выглядеть следующим образом:

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

Кодекс Крови. Книга III

Борзых М.
3. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга III

Его темная целительница

Крааш Кира
2. Любовь среди туманов
Фантастика:
фэнтези
5.75
рейтинг книги
Его темная целительница

Восход. Солнцев. Книга VIII

Скабер Артемий
8. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга VIII

Сумеречный стрелок 6

Карелин Сергей Витальевич
6. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный стрелок 6

Герой

Бубела Олег Николаевич
4. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Герой

Студент из прошлого тысячелетия

Еслер Андрей
2. Соприкосновение миров
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Студент из прошлого тысячелетия

Книга пяти колец. Том 4

Зайцев Константин
4. Книга пяти колец
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Книга пяти колец. Том 4

Кодекс Крови. Книга IХ

Борзых М.
9. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IХ

Генерал-адмирал. Тетралогия

Злотников Роман Валерьевич
Генерал-адмирал
Фантастика:
альтернативная история
8.71
рейтинг книги
Генерал-адмирал. Тетралогия

Гарем вне закона 18+

Тесленок Кирилл Геннадьевич
1. Гарем вне закона
Фантастика:
фэнтези
юмористическая фантастика
6.73
рейтинг книги
Гарем вне закона 18+

Сколько стоит любовь

Завгородняя Анна Александровна
Любовные романы:
любовно-фантастические романы
6.22
рейтинг книги
Сколько стоит любовь

Девяностые приближаются

Иванов Дмитрий
3. Девяностые
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Девяностые приближаются

Рота Его Величества

Дроздов Анатолий Федорович
Новые герои
Фантастика:
боевая фантастика
8.55
рейтинг книги
Рота Его Величества

Идеальный мир для Лекаря 13

Сапфир Олег
13. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 13