Разработка приложений в среде 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) {
Поделиться:
Популярные книги
Война
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