Разработка приложений в среде 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.с
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: }
Поделиться:
Популярные книги
Дракон с подарком
3. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
6.62
рейтинг книги
Бывшие. Война в академии магии
2. Измены
Любовные романы:
любовно-фантастические романы
7.00
рейтинг книги
Мастер клинков. Начало пути
1. Мастер клинков
Фантастика:
фэнтези
9.16
рейтинг книги
Имя нам Легион. Том 8
8. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Измена. Право на счастье
1. Чем закончится измена
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Начальник милиции 2
2. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Камень. Книга 4
4. Камень
Фантастика:
боевая фантастика
7.77
рейтинг книги
Измена. Мой заклятый дракон
Любовные романы:
любовно-фантастические романы
7.50
рейтинг книги
Предатель. Цена ошибки
Измена
Любовные романы:
современные любовные романы
5.75
рейтинг книги
Звездная Кровь. Изгой
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Рождение победителя
3. Девятый
Фантастика:
фэнтези
альтернативная история
9.07
рейтинг книги
Барону наплевать на правила
7. Закон сильного
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Камень. Книга шестая
6. Камень
Фантастика:
боевая фантастика
7.64
рейтинг книги
Чужая дочь
Любовные романы:
любовно-фантастические романы
5.00