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

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

Жанры

Разработка приложений в среде 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
рейтинг книги
Метатель. Книга 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