Разработка приложений в среде Linux. Второе издание
Шрифт:
67:
68: if (pid == 0) {
69: int slave; /* файловый дескриптор для подчиненного компонента pty*/
70:
71: /* Мы находимся в дочернем процессе */
72: close(master);
73:
74: if ((slave = get_slave_pty(name)) < 0) {
75: perror("ptypair: не удается открыть подчиненный компонент pty");
76: exit(1);
77: }
78: free(name);
79:
80: /*
Мы должны сделать этот процесс лидером группы сеансов,
81: * поскольку он выполняется на новом PTY, а функции вроде
82: * управления заданиями просто не будут корректно работать,
83: * если нет лидера группы сеансов и лидера группы процессов
84: * (который автоматически является лидером группы сеансов).
85: * Это также разъединяет со старым управляющим tty.
86: */
87: if (setsid < 0) {
88: perror("невозможно установить лидер сеанса");
89: }
90:
91: /* Соединиться с новым управляющим tty. */
92: if (ioctl(slave, TIOCSCTTY, NULL)) {
93: perror("невозможно установить новый управляющий tty");
94: }
95:
96: /* сделать подчиненный pty стандартным устройством ввода, вывода и ошибок */
97: dup2(slave, STDIN_FILENO);
98: dup2(slave, STDOUT_FILENO);
99: dup2(slave, STDERR_FILENO);
100:
101: /* в этой точке подчиненный pty должен быть стандартным устройством ввода */
102: if (slave > 2) {
103: close(slave);
104: }
105:
106: /* Попытаться восстановить размеры окна; сбой не является критичным */
107: if (ioctl(STDOUT_FILENO, TIOCSWINSZ, &ws) < 0) {
108: perror("не удается восстановить размеры окна");
109: }
110:
111: /* запустить оболочку */
112: execl("/bin/sh", "/bin/sh", 0);
113:
114: /* сюда управление никогда не попадет */
115: exit(1);
116: }
117:
118: /* родительский процесс */
119: free(name);
120:
121: /*
Обратите внимание, что настройки termios устанавливаются только
122: * для стандартного ввода; ведущая сторона pty НЕ является tty.
123: */
124: tcgetattr(STDIN_FILENO, &ot);
125: t = ot;
126: t.c_lflag &= ~(ICANON | ISIG | ECHO | ECHOCTL | ECHOE |
127: ECHOK | ECHOKE | ECHONL | ECHOPRT);
128: t.c_iflag |= IGNBRK;
129: t.c_cc[VMIN] = 1;
130: t.c_cc[VTIME] = 0;
131: tcsetattr(STDIN_FILENO, TCSANOW, &t);
132:
133: /* Этот код взят без изменений из robin.с
134: * Если дочерний процесс завершается, читающая ведущая сторона
135: * должна вернуть -1 и завершиться.
136: */
137: ufds[0].fd = STDIN_FILENO;
138: ufds[0].events = POLLIN;
139: ufds[1].fd = master;
140: ufds[1].events = POLLIN;
141:
142: do {
143: int r;
144:
145: r = poll(ufds, 2, -1);
146: if ((r < 0) && (errno != EINTR)) {
147: done = 1;
148: break;
149: }
150:
151: /* сначала проверить возможность завершения */
152: if ((ufds[0].revents | ufds[1].revents) &
153: (POLLERR | POLLHUP | POLLNVAL)) {
154: done = 1;
155: break;
156: }
157:
158: if (propagate_sigwinch) {
159: /* обработчик сигнала запросил распространение SIGWINCH */
160: if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) < 0) {
161: perror("ptypair: не удается получить размеры окна");
162: }
163: if (ioctl(master, TIOCSWINSZ, &ws) < 0) {
164: perror("не удается восстановить размеры окна");
165: }
166:
167: /* не делать этого снова до поступления следующего SIGWINCH */
Поделиться:
Популярные книги
Тройняшки не по плану. Идеальный генофонд
Роковые подмены
Любовные романы:
современные любовные романы
6.80
рейтинг книги
Барон играет по своим правилам
5. Закон сильного
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Завод-3: назад в СССР
3. Завод
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Секретарь лорда Демона
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Отец моего жениха
Любовные романы:
современные любовные романы
7.79
рейтинг книги
Идеальный мир для Лекаря 10
10. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Я тебя не отпущу
4. Оголенные чувства
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Бастард Императора. Том 7
7. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Девочка из прошлого
3. Айдаровы
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Вернуть невесту. Ловушка для попаданки 2
2. Вернуть невесту
Любовные романы:
любовно-фантастические романы
7.88
рейтинг книги
Идеальный мир для Лекаря 7
7. Лекарь
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Хозяйка дома на холме
1. Хозяйка своей судьбы
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Жена проклятого некроманта
Фантастика:
фэнтези
6.60
рейтинг книги
Имя нам Легион. Том 9
9. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00