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

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

Жанры

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

Троан Эрик В.

Шрифт:

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

112: }

113:

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

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 <errno.h>

4: #include <fcntl.h>

5: #include <signal.h>

6: #include <stdio.h>

7: #include <stdlib.h>

8: #include <string.h>

9: #include <sys/ioctl.h>

 10: #include <sys/poll.h>

 11: #include <sys/stat.h>

 12: #include <termios.h>

 13: #include <unistd.h>

 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: }

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

Война

Валериев Игорь
7. Ермак
Фантастика:
боевая фантастика
альтернативная история
5.25
рейтинг книги
Война

Экономка тайного советника

Семина Дия
Фантастика:
фэнтези
5.00
рейтинг книги
Экономка тайного советника

Чужбина

Седой Василий
2. Дворянская кровь
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чужбина

Мятежник

Прокофьев Роман Юрьевич
4. Стеллар
Фантастика:
боевая фантастика
7.39
рейтинг книги
Мятежник

Бестужев. Служба Государевой Безопасности. Книга вторая

Измайлов Сергей
2. Граф Бестужев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бестужев. Служба Государевой Безопасности. Книга вторая

Метатель. Книга 3

Тарасов Ник
3. Метатель
Фантастика:
попаданцы
альтернативная история
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель. Книга 3

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

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

Ты не мой BOY

Рам Янка
5. Самбисты
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Ты не мой BOY

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

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

Лекарь для захватчика

Романова Елена
Фантастика:
попаданцы
историческое фэнтези
фэнтези
5.00
рейтинг книги
Лекарь для захватчика

Отверженный VI: Эльфийский Петербург

Опсокополос Алексис
6. Отверженный
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Отверженный VI: Эльфийский Петербург

Он тебя не любит(?)

Тоцка Тала
Любовные романы:
современные любовные романы
7.46
рейтинг книги
Он тебя не любит(?)

Убивать чтобы жить 3

Бор Жорж
3. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 3

Темный Лекарь 11

Токсик Саша
11. Темный Лекарь
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Темный Лекарь 11