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

Интервал:

Закладка:

Сделать

115: propagate_sigwinch = 0;

116:

117: /* опрос мог быть прерван SIGWINCH,

118: * потому повторить попытку.

119: */

120: continue;

121: }

122:

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

124: i = read (master, buf, BUFSIZE);

125: if (i >= 1) {

126: write(STDOUT_FILENO, buf, i);

127: } else {

128: done = 1;

129: }

130: }

131:

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

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

134: if (i >= 1) {

135: write(master, buf, i);

136: } else {

137: done = 1;

138: }

139: }

140:

141: } while (!done);

142:

143: tcsetattr(STDIN_FILENO, TCSANOW, &ot);

144: exit(0);

145: }

Программа forkptytest.сделает очень немногое из того, чего вы раньше не видели. Обработка сигналов рассматривается в главе 12, а цикл poll()почти полностью переписан из кода robin.с, представленного ранее в этой главе (за исключением обработки управляющих символов), равно как и код, модифицирующий настройки termios.

Остается лишь объяснить распространение изменений размеров окна.

В строке 105 после завершения poll()мы проверяем, является ли причиной завершения poll()сигнал SIGWINCH, доставляемый функции sigwinch_handlerв строке 20. Если это так, необходимо получить новый размер текущего окна из стандартного ввода и распространить его в pty подчиненного компонента. Установкой размера окна SIGWINCHпередается автоматически процессу, работающему на pty; мы не должны явно передавать SIGWINCHэтому процессу.

Теперь для сравнения посмотрите, насколько усложняется этот код в случае использования функций, определенных в ptypair.с.

1: /* ptytest.с */

2:

3: #include

4: #include

5: #include

6: #include

7: #include

8: #include

9: #include

10: #include

11: #include

12: #include

13: #include

14: #include "ptypair.h"

15:

16:

17: volatile int propagate_sigwinch = 0;

18:

19: /* sigwinch_handler

20: * распространяет изменения размеров окна из входного файлового

21: * дескриптора на ведущую сторону pty.

22: */

23: void sigwinch_handler(int signal) {

24: propagate_sigwinch = 1;

25: }

26:

27:

28: /* ptytest пытается открыть пару pty с запуском оболочки

29: * на подчиненной стороне pty.

30: */

31: int main(void) {

32: int master;

33: int pid;

34: char * name;

35: struct pollfd ufds[2];

36: int i;

37: #define BUFSIZE 1024

38: char buf[1024];

39: struct termios ot, t;

40: struct winsize ws;

41: int done = 0;

42: struct sigaction act;

43:

44: if ((master = get_master_pty(&name)) < 0) {

45: perror("ptypair: не удается открыть ведущее устройство pty");

46: exit(1);

47: }

48:

49: /* установить обработчик SIGWINCH */

50: act.sa_handler = sigwinch_handler;

51: sigemptyset(&(act.sa_mask));

52: act.sa_flags = 0;

53: if (sigaction (SIGWINCH, &act, NULL) < 0) {

54: perror("ptypair: невозможно обработать SIGWINCH");

55: exit(1);

56: }

57:

58: if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) < 0) {

59: perror("ptypair: не удается получить размеры окна");

60: exit(1);

61: }

62:

63: if ((pid = fork()) < 0) {

64: perror("ptypair");

65: exit(1);

66: }

67:

68: if (pid == 0) {

69: int slave; /* файловый дескриптор для подчиненного компонента pty*/

70:

71: /* Мы находимся в дочернем процессе */

72: close(master);

73:

74: if ((slave = get_slave_pty(name)) < 0) {

75: perror("ptypair: не удается открыть подчиненный компонент pty");

76: exit(1);

77: }

78: free(name);

79:

80: /* Мы должны сделать этот процесс лидером группы сеансов,

81: * поскольку он выполняется на новом PTY, а функции вроде

82: * управления заданиями просто не будут корректно работать,

83: * если нет лидера группы сеансов и лидера группы процессов

84: * (который автоматически является лидером группы сеансов).

85: * Это также разъединяет со старым управляющим tty.

86: */

87: if (setsid() < 0) {

88: perror("невозможно установить лидер сеанса");

89: }

90:

91: /* Соединиться с новым управляющим tty. */

92: if (ioctl(slave, TIOCSCTTY, NULL)) {

93: perror("невозможно установить новый управляющий tty");

94: }

95:

96: /* сделать подчиненный pty стандартным устройством ввода, вывода и ошибок */

97: dup2(slave, STDIN_FILENO);

98: dup2(slave, STDOUT_FILENO);

99: dup2(slave, STDERR_FILENO);

100:

101: /* в этой точке подчиненный pty должен быть стандартным устройством ввода */

102: if (slave > 2) {

103: close(slave);

104: }

105:

106: /* Попытаться восстановить размеры окна; сбой не является критичным */

107: if (ioctl(STDOUT_FILENO, TIOCSWINSZ, &ws) < 0) {

108: perror("не удается восстановить размеры окна");

109: }

110:

111: /* запустить оболочку */

112: execl("/bin/sh", "/bin/sh", 0);

113:

114: /* сюда управление никогда не попадет */

115: exit(1);

116: }

117:

118: /* родительский процесс */

119: free(name);

120:

121: /* Обратите внимание, что настройки termios устанавливаются только

122: * для стандартного ввода; ведущая сторона pty НЕ является tty.

123: */

124: tcgetattr(STDIN_FILENO, &ot);

125: t = ot;

126: t.c_lflag &= ~(ICANON | ISIG | ECHO | ECHOCTL | ECHOE |

127: ECHOK | ECHOKE | ECHONL | ECHOPRT);

128: t.c_iflag |= IGNBRK;

129: t.c_cc[VMIN] = 1;

130: t.c_cc[VTIME] = 0;

131: tcsetattr(STDIN_FILENO, TCSANOW, &t);

132:

133: /* Этот код взят без изменений из robin.с

134: * Если дочерний процесс завершается, читающая ведущая сторона

135: * должна вернуть -1 и завершиться.

136: */

137: ufds[0].fd = STDIN_FILENO;

138: ufds[0].events = POLLIN;

139: ufds[1].fd = master;

140: ufds[1].events = POLLIN;

141:

142: do {

143: int r;

144:

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

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

147: done = 1;

148: break;

149: }

150:

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

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

153: (POLLERR | POLLHUP | POLLNVAL)) {

154: done = 1;

155: break;

156: }

157:

158: if (propagate_sigwinch) {

159: /* обработчик сигнала запросил распространение SIGWINCH */

160: if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) < 0) {

161: perror("ptypair: не удается получить размеры окна");

162: }

163: if (ioctl(master, TIOCSWINSZ, &ws) < 0) {

164: perror("не удается восстановить размеры окна");

165: }

166:

167: /* не делать этого снова до поступления следующего SIGWINCH */

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

Интервал:

Закладка:

Сделать


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

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




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


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


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

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