Разработка приложений в среде Linux. Второе издание
Шрифт:
1: /* forkptytest.с */
2:
3: #include <errno.h>
4: #include <signal.h>
5: #include <stdio.h>
6: #include <stdlib.h>
7: #include <sys/ioctl.h>
8: #include <sys/poll.h>
9: #include <termios.h>
10: #include <unistd.h>
11: #include <pty.h>
12:
13:
14: volatile int propagate_sigwinch = 0;
15:
16: /* sigwinch_handler
17: *
распространяет изменения размеров окна из входного файлового
18: * дескриптора на ведущую сторону pty.
19: */
20: void sigwinch_handler(int signal) {
21: propagate_sigwinch = 1;
22: }
23:
24:
25: /* forkptytest пытается открыть пару pty с запуском оболочки
26: * на подчиненной стороне pty.
27: */
28: int main(void) {
29: int master;
30: int pid;
31: struct pollfd ufds[2];
32: int i;
33: #define BUFSIZE 1024
34: char buf[1024];
35: struct termios ot, t;
36: struct winsize ws;
37: int done = 0;
38: struct sigaction act;
39:
40: if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) < 0) {
41: perror("ptypair: не удается получить размеры окна");
42: exit(1);
43: }
44:
45: if ((pid = forkpty(&master, NULL, NULL, &ws)) < 0) {
46: perror("ptypair");
47: exit(1);
48: }
49:
50: if (pid == 0) {
51: /* запустить оболочку */
52: execl("/bin/sh", "/bin/sh", 0);
53:
54: /* сюда управление никогда не попадет */
55: exit(1);
56: }
57:
58: /* родительский процесс */
59: /* установить обработчик SIGWINCH */
60: act.sa_handler = sigwinch_handler;
61: sigemptyset(&(act.sa_mask));
62: act.sa_flags = 0;
63: if (sigaction(SIGWINCH, &act, NULL) < 0) {
64: perror("ptypair:
невозможно обработать SIGWINCH");
65: exit(1);
66: }
67:
68: /* Обратите внимание, что настройки termios устанавливаются только
69: * для стандартного ввода; ведущая сторона pty НЕ является tty.
70: */
71: tcgetattr(STDIN_FILENO, &ot);
72: t = ot;
73: t.c_lflag &= ~(ICANON | ISIG | ECHO | ECHOCTL | ECHOE |
74: ECHOK | ECHOKE | ECHONL | ECHOPRT);
75: t.c_iflag |= IGNBRK;
76: t.c_cc[VMIN] = 1;
77: t.c_cc[VTIME] = 0;
78: tcsetattr(STDIN_FILENO, TCSANOW, &t);
79:
80: /* Этот код взят без изменений из robin.с
81: * Если дочерний процесс завершается, читающая ведущая сторона
82: * дoлжнa вернуть -1 и завершиться.
83: */
84: ufds[0].fd = STDIN_FILENO;
85: ufds[0].events = POLLIN;
86: ufds[1].fd = master;
87: ufds[1].events = POLLIN;
88:
89: do {
90: int r;
91:
92: r = poll(ufds, 2, -1);
93: if ((rs < 0) && (errno != EINTR)) {
94: done = 1;
95: break;
96: }
97:
98: /* сначала проверить возможность завершения */
99: if ((ufds[0].revents | ufds[1].revents) &
100: (POLLERR | POLLHUP | POLLNVAL)) {
101: done = 1;
102: break;
103: }
104:
105: if (propagate_sigwinch) {
106: /* обработчик сигналов запросил распространение SIGWINCH */
107: if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) < 0) {
108: perror("ptypair: не удается получить размеры окна");
109: }
110: if (ioctl(master, TIOCSWINSZ, &ws) < 0) {
Поделиться:
Популярные книги
Дракон с подарком
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