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

Троан Эрик В.

Шрифт:

19: tcsetattr(STDIN_FILENO, TCSAFLUSH, &ts);

20:

21: /*хоть это и параноидально, но проверить, возымели ли эффект новые настройки*/

22: tcgetattr(STDIN_FILENO, &ts);

23: if (ts.c_lflag & ECHO) {

24: fprintf(stderr, "Сбой при отключении эхо-контроля\n");

25: tcsetattr(STDIN_FILENO, TCSANOW, &ots);

26: exit(1);

27: }

28:

29: /* получить и вывести пароль */

30: printf("введите пароль:");

31: fflush(stdout);

32: fgets(passbuf, 1024, stdin);

33: printf("прочитан пароль: %s", passbuf);

34: /* в passbuf был завершающий символ \n */

35:

36: /* восстановить старые настройки termios */

37: tcsetattr(STDIN_FILENO, TCSANOW, &ots);

38:

39: exit(0);

40: }

16.3.2. Последовательные коммуникации

В качестве примера программирования обоих концов tty рассмотрим программу, подключающую текущий терминал к последовательному порту. На одном tty программа под названием

robin
сообщается с вами во время набора. На другом tty она взаимодействует с последовательным портом. С целью мультиплексирования вводных и выходных данных на локальном tty и последовательном порте программа использует системный вызов
poll
, описанный в главе 13.

Ниже приведен полный код программы

robin.с
, за которым даны объяснения.

1: /* robin.с */

2:

3: #include <sys/poll.h>

4: #include <errno.h>

5: #include <fcntl.h>

6: #include <popt.h>

7: #include <stdio.h>

8: #include <stdlib.h>

9: #include <signal.h>

 10: #include <string.h> /* для strerror */

 11: #include <termios.h>

 12: #include <unistd.h>

 13:

 14: void die(int exitcode, const char *error, const char *addl) {

 15: if (error) fprintf(stderr, "%s: %s\n", error, addl);

 16: exit(exitcode);

 17: }

 18:

 19: speed_t symbolic_speed(int speednum) {

 20: if (speednum >= 460800) return B460800;

 21: if (speednum >= 230400) return B230400;

 22: if (speednum >= 115200) return B115200;

 23: if (speednum >= 57600) return B57600;

 24: if (speednum >= 38400) return B38400;

 25: if (speednum >= 19200) return B19200;

 26: if (speednum >= 9600) return B9600;

 27: if (speednum >= 4800) return B4800;

 28: if (speednum >= 2400) return B2400;

 29: if (speednum >= 1800) return B1800;

 30: if (speednum >= 1200) return B1200;

 31: if (speednum >= 600) return B600;

 32: if (speednum >= 300) return B300;

 33: if (speednum >= 200) return B200;

 34: if (speednum >= 150) return B150;

 35: if (speednum >= 134) return B134;

 36: if (speednum >= 110) return B110;

 37: if (speednum >= 75) return B75;

 38: return B50;

 39: }

 40:

 41: /* Это нужно для области видимости в пределах файла, так что

 42: * их можно будет использовать в обработчиках сигналов */

 43: /* старые настройки порта termios для восстановления */

 44: static struct termios pots;

  • Читать дальше
  • 1
  • ...
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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