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

Тут можно читать онлайн Майкл Джонсон - Разработка приложений в среде Linux. Второе издание - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-osnet, издательство Вильямс, год 2007. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Разработка приложений в среде Linux. Второе издание
  • Автор:
  • Жанр:
  • Издательство:
    Вильямс
  • Год:
    2007
  • Город:
    Москва
  • ISBN:
    978-5-8459-1143-8
  • Рейтинг:
    3.8/5. Голосов: 101
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

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

Разработка приложений в среде Linux. Второе издание - описание и краткое содержание, автор Майкл Джонсон, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

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

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

Разработка приложений в среде Linux. Второе издание - читать онлайн бесплатно полную версию (весь текст целиком)

Разработка приложений в среде Linux. Второе издание - читать книгу онлайн бесплатно, автор Майкл Джонсон
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

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

4: #include

5: #include

6: #include

7: #include

8: #include

9: #include

10: #include /* для strerror() */

11: #include

12: #include

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;

45: /* старые настройки stdout/stdin termios для восстановления */

46: static struct termios sots;

47: /* файловый дескриптор порта */

48: int pf;

49:

50: /* восстановить первоначальные настройки терминала при выходе */

51: void cleanup_termios(int signal) {

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

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

54: exit(0);

55: }

56:

57: /* обработать одиночный управляющий символ */

58: void send_escape(int fd, char c) {

59: switch (c) {

60: case 'q':

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

62: cleanup_termios(0);

63: break;

64: case 'b':

65: /* послать символ разрыва*/

66: tcsendbreak(fd, 0);

67: break;

68: default:

69: /* пропустить символ */

70: /* "C-\ C-\" sends "C-\" */

71: write(fd, &c, 1);

72: break;

73: }

74: return;

75: }

76:

77: /* обработать управляющие символы, записывая их в вывод */

78: void cook_buf(int fd, char * buf, int num) {

79: int current = 0;

80: static int in_escape = 0;

81:

82: if (in_escape) {

83: /* cook_buf последний раз вызывался с незавершенной

84: управляющей последовательностью */

85: send_escape(fd, buf[0]);

86: num--;

87: buf++;

88: in_escape = 0;

89: }

90: while (current < num) {

91: # define CTRLCHAR(c) ((c)-0x40)

92: while ((current < num) && (buf[current] != CTRLCHAR('W')))

93: current++;

94: if (current) write (fd, buf, current);

95: if (current < num) {

96: /* найден управляющий символ */

97: current++;

98: if (current >= num) {

99: /*интерпретировать первый символ следующей последовательности*/

100: in_escape = 1;

101: return;

102: }

103: send_escape(fd, buf[current]);

104: }

105: num -= current;

106: buf += current;

107: current = 0;

108: }

109: return;

110: }

111:

112: int main(int argc, const char * argv[]) {

113: char с; /* используется для разбора аргументов */

114: struct termios pts; /* настройки termios для порта */

115: struct termios sts; /* настройки termios для stdout/stdin */

116: const char *portname;

117: int speed = 0; /* используется при разборе аргументов для скорости */

118: struct sigaction sact; /* используется для инициализации обработчика сигналов */

119: struct pollfd ufds[2]; /* взаимодействие с poll() */

120: int raw = 0; /* неформатированный режим? */

121: int flow = 0; /* тип управления потоком, если применяется*/

122: int crnl = 0; /* посылать ли символ возврата каретки с символом новой строки? */

123: int i = 0; /* используется в цикле мультиплексирования*/

124: int done = 0; 125: # define BUFSIZE 1024

126: char buf[BUFSIZE];

127: poptContext optCon; /* контекст опций командной строки */

128: struct poptOption optionsTable[] = {

129: { "bps", 'b', POPT_ARG_INT, &speed, 0,

130: "скорость передачи сигналов, бит/с",

131: "" },

132: { "crnl", 'с', POPT_ARG_VAL, &crnl, 'с',

133: "посылать символ возврата каретки с символом новой строки", NULL },

134: { "hwflow", 'h', POPT_ARG_VAL, &flow, 'h',

135: "использовать аппаратное управление потоком", NULL },

136: { "swflow", 's', POPT_ARG_VAL, &flow, 's',

137: "использовать программное управление потоком", NULL },

138: { "noflow", 'n', POPT_ARG_VAL, &flow, 'n',

139: "отключить управление потоком", NULL },

140: { "raw", 'r', POPT_ARG_VAL, &raw, 1,

141: "включить неформатированный режим", NULL },

142: POPT_AUTOHELP

143: { NULL, '\0', 0, NULL, '\0', NULL, NULL }

144: };

145:

146: #ifdef DSLEEP

147: /* ожидать 10 минут, что позволить подключить отладчик */

148: sleep(600);

149: #endif

150:

151: optCon = poptGetContext("robin", argc, argv, optionsTable, 0);

152: poptSetOtherOptionHelp(optCon, "");

153:

154: if (argc < 2) {

155: poptPrintUsage(optCon, stderr, 0);

156: die(1, "He достаточно аргументов", "");

157: }

158:

159: if ((с = poptGetNextOpt(optCon)) < -1) {

160: /* ошибка во время обработки опций */

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

162: poptBadOption(optCon, POPT_BADOPTION_NOALIAS),

163: poptStrerror(c));

164: return 1;

165: }

166: portname = poptGetArg(optCon);

167: if (!portname) {

168: poptPrintUsage(optCon, stderr, 0);

169: die(1, "He указано имя порта", "");

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Майкл Джонсон читать все книги автора по порядку

Майкл Джонсон - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




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


Отзывы читателей о книге Разработка приложений в среде Linux. Второе издание, автор: Майкл Джонсон. Читайте комментарии и мнения людей о произведении.


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

Напишите свой комментарий
x