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

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

Жанры

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

Троан Эрик В.

Шрифт:

224: pts.c_cflag &= ~CRTSCTS;

225: pts.c_iflag &= ~(IXON | IXOFF | IXANY);

226: break;

227: }

228: if (crnl) {

229: /* послать CR с NL */

230: pts.c_oflag |= ONLCR;

231: }

232:

233: /* скорость не изменяется, пока не будет указано -b */

234: if (speed) {

235: cfsetospeed(&pts, symbolic_speed(speed));

236: cfsetispeed(&pts, symbolic_speed(speed));

237: }

238:

239: /*
установить обработчик сигналов для восстановления

240: * старого обработчика termios */

241: sact.sa_handler = cleanup_termios;

242: sigaction(SIGHUP, &sact, NULL);

243: sigaction(SIGINT, &sact, NULL);

244: sigaction(SIGPIPE, &sact, NULL);

245: sigaction(SIGTERM, &sact, NULL);

246:

247: /* установить измененные настройки termios */

248: tcsetattr(pf, TCSANOW, &pts);

249: tcsetattr(STDIN_FILENO, TCSANOW, &sts);

250:

251: ufds[0].fd = STDIN_FILENO;

252: ufds[0].events = POLLIN;

253: ufds[1].fd = pf;

254: ufds[1].events = POLLIN;

255:

256: do {

257: int r;

258:

259: r = poll(ufds, 2, -1);

260: if ((r < 0) && (errno != EINTR))

261: die(1, "неожиданный сбой poll", "");

262:

263: /* сначала проверить возможность завершения */

264: if ((ufds[0].revents | ufds[1].revents) &

265: (POLLERR | POLLHUP | POLLNVAL)) {

266: done = 1;

267: break;

268: }

269:

270: if (ufds[1].revents & POLLIN) {

271: /* pf содержит символы */

272: i = read (pf, buf, BUFSIZE);

273: if (i >= 1) {

274: write(STDOUT_FILENO, buf, i);

275: } else {

276: done = 1;

277: }

278: }

279: if (ufds[0].revents & POLLIN) {

280: /* стандартный ввод содержит символы */

281: i = read(STDIN_FILENO, buf, BUFSIZE);

282: if (i >= 1) {

283: if (raw) {

284: write(pf, buf, i);

285: } else {

286: cook_buf(pf, buf, i);

287: }

288: } else {

289: done = 1;

290: }

291: }

292: } while (!done);

293:

294: /*
восстановить первоначальные настройки терминала и завершиться*/

295: tcsetattr(pf, TCSANOW, &pots);

296: tcsetattr(STDIN_FILENO, TCSANOW, &sots);

297: exit(0);

298: }

Код

robin.с
начинается с включения нескольких заголовочных файлов (почитайте man-страницы для каждого системного вызова и библиотечной функции, чтобы узнать, какие файлы включать), а затем в нем определяются несколько полезных функций.

Функция

symbolic_speed
в строке 19 преобразует целочисленную скорость в символическую, которую поддерживает
termios
. К сожалению, termios не предназначен для работы с произвольными скоростями, так что каждая скорость, которую вы хотите использовать, должна быть частью интерфейса пользователь — ядро [110] .

Обратите внимание, что предусмотрены и довольно высокие скорости. Не все последовательные порты поддерживают скорости 230 400 или 460 800 бит/с; в стандарте POSIX определены скорости лишь до 38 400 бит/с. Чтобы сделать эту программу переносимой, каждую строку над строкой, в которой устанавливается скорость 38 400 бит/с, потребуется расширить до трех строк, как показано ниже:

110

На man-странице

setserial
описан способ обхода этого ограничения, специфический для Linux.

#ifdef В460800

if (speednum >= 460800) return B46000;

#end if

Это позволит пользователям устанавливать скорости выше тех, которые последовательные порты способны поддерживать, а исходный код теперь будет компилироваться в любой системе с POSIX

termios
. (Как упоминалось ранее в этой главе, любой последовательный порт может отказаться принять на обработку любую установку
termios
, которую он не способен поддержать, включая также установки скорости. Поэтому установка
B460800
не означает, что можно установить скорость порта равной 460 800 бит/с.)

В строках 44—55 определяются глобальные переменные для передачи некоторых переменных обработчику сигналов и сам обработчик сигналов. Обработчик сигналов предназначен для восстановления настроек termios на обоих интерфейсах tty при доставке сигнала, поэтому ему необходимо получить доступ к структурам, содержащим старые настройки

termios
. Ему также необходимо знать файловый дескриптор или последовательный порт (файловый дескриптор для стандартных входных данных не меняется, поэтому компилируется в бинарный). Этот код идентичен коду в случае нормального пути завершения, который рассматривается позже. Обработчик сигналов затем прикрепляется к сигналам, которые завершат процесс, если они были проигнорированы.

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

Солнечный корт

Сакавич Нора
4. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Солнечный корт

О, мой бомж

Джема
1. Несвятая троица
Любовные романы:
современные любовные романы
5.00
рейтинг книги
О, мой бомж

Возвышение Меркурия. Книга 2

Кронос Александр
2. Меркурий
Фантастика:
фэнтези
5.00
рейтинг книги
Возвышение Меркурия. Книга 2

Вы не прошли собеседование

Олешкевич Надежда
1. Укротить миллионера
Любовные романы:
короткие любовные романы
5.00
рейтинг книги
Вы не прошли собеседование

Метаморфозы Катрин

Ром Полина
Фантастика:
фэнтези
8.26
рейтинг книги
Метаморфозы Катрин

Эволюция мага

Лисина Александра
2. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эволюция мага

Попаданка для Дракона, или Жена любой ценой

Герр Ольга
Любовные романы:
любовно-фантастические романы
7.17
рейтинг книги
Попаданка для Дракона, или Жена любой ценой

Истинная поневоле, или Сирота в Академии Драконов

Найт Алекс
3. Академия Драконов, или Девушки с секретом
Любовные романы:
любовно-фантастические романы
6.37
рейтинг книги
Истинная поневоле, или Сирота в Академии Драконов

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

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

Кодекс Охотника. Книга XXI

Винокуров Юрий
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXI

Возвышение Меркурия. Книга 17

Кронос Александр
17. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 17

Переиграть войну! Пенталогия

Рыбаков Артем Олегович
Переиграть войну!
Фантастика:
героическая фантастика
альтернативная история
8.25
рейтинг книги
Переиграть войну! Пенталогия

Волков. Гимназия №6

Пылаев Валерий
1. Волков
Фантастика:
попаданцы
альтернативная история
аниме
7.00
рейтинг книги
Волков. Гимназия №6

Картофельное счастье попаданки

Иконникова Ольга
Фантастика:
фэнтези
5.00
рейтинг книги
Картофельное счастье попаданки