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

на главную

Жанры

Разработка приложений в среде 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 */

Поделиться:
Популярные книги

СД. Восемнадцатый том. Часть 1

Клеванский Кирилл Сергеевич
31. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
6.93
рейтинг книги
СД. Восемнадцатый том. Часть 1

Вторая невеста Драконьего Лорда. Дилогия

Огненная Любовь
Вторая невеста Драконьего Лорда
Любовные романы:
любовно-фантастические романы
5.60
рейтинг книги
Вторая невеста Драконьего Лорда. Дилогия

Вечная Война. Книга VII

Винокуров Юрий
7. Вечная Война
Фантастика:
юмористическая фантастика
космическая фантастика
5.75
рейтинг книги
Вечная Война. Книга VII

Темный Патриарх Светлого Рода 6

Лисицин Евгений
6. Темный Патриарх Светлого Рода
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Темный Патриарх Светлого Рода 6

Не верь мне

Рам Янка
7. Самбисты
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Не верь мне

Неудержимый. Книга III

Боярский Андрей
3. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга III

LIVE-RPG. Эволюция-1

Кронос Александр
1. Эволюция. Live-RPG
Фантастика:
социально-философская фантастика
героическая фантастика
киберпанк
7.06
рейтинг книги
LIVE-RPG. Эволюция-1

Колючка для высшего эльфа или сиротка в академии

Жарова Анита
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Колючка для высшего эльфа или сиротка в академии

Адский пекарь

Дрейк Сириус
1. Дорогой пекарь!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Адский пекарь

Я до сих пор не князь. Книга XVI

Дрейк Сириус
16. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я до сих пор не князь. Книга XVI

Огненный князь

Машуков Тимур
1. Багряный восход
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Огненный князь

Царь поневоле. Том 1

Распопов Дмитрий Викторович
4. Фараон
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Царь поневоле. Том 1

Конструктор

Семин Никита
1. Переломный век
Фантастика:
попаданцы
альтернативная история
4.50
рейтинг книги
Конструктор

Сильнейший ученик. Том 2

Ткачев Андрей Юрьевич
2. Пробуждение крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сильнейший ученик. Том 2