Разработка приложений в среде 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: }
Поделиться:
Популярные книги
Война
7. Ермак
Фантастика:
боевая фантастика
альтернативная история
5.25
рейтинг книги
Экономка тайного советника
Фантастика:
фэнтези
5.00
рейтинг книги
Чужбина
2. Дворянская кровь
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Мятежник
4. Стеллар
Фантастика:
боевая фантастика
7.39
рейтинг книги
Бестужев. Служба Государевой Безопасности. Книга вторая
2. Граф Бестужев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Метатель. Книга 3
3. Метатель
Фантастика:
попаданцы
альтернативная история
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Студент из прошлого тысячелетия
2. Соприкосновение миров
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Ты не мой BOY
5. Самбисты
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Идеальный мир для Лекаря 2
2. Лекарь
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Лекарь для захватчика
Фантастика:
попаданцы
историческое фэнтези
фэнтези
5.00
рейтинг книги
Отверженный VI: Эльфийский Петербург
6. Отверженный
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Он тебя не любит(?)
Любовные романы:
современные любовные романы
7.46
рейтинг книги
Убивать чтобы жить 3
3. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Темный Лекарь 11
11. Темный Лекарь
Фантастика:
попаданцы
аниме
фэнтези
5.00