Вход/Регистрация
Разработка приложений в среде Linux. Второе издание
вернуться

Троан Эрик В.

Шрифт:

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 */

168: propagate_sigwinch = 0;

169:

170: /* опрос мог быть прерван SIGWINCH,

171: * потому повторить попытку. */

172: continue;

173: }

174:

175: if (ufds[1].revents & POLLIN) {

176: i = read (master, buf, BUFSIZE);

177: if (i >= 1) {

178: write(STDOUT_FILENO, buf, i);

179: } else {

180: done = 1;

181: }

182: }

183:

184: if (ufds[0].revents & POLLIN) {

185: i = read (STDIN_FILENO, buf, BUFSIZE);

186: if (i >= 1) {

187: write(master, buf, i);

188: } else {

189: done = 1;

190: }

191: }

192: } while (!done);

193:

194: tcsetattr(STDIN_FILENO, TCSANOW, &ot);

195: exit(0);

196: }

Вся добавленная сложность

ptytest.с
по сравнению с
forkptytest.с
связана с обработкой старого интерфейса. Все это было описано в данной главе, кроме запуска дочернего процесса, который рассматривался в главе 10.

Глава 17

Работа в сети с помощью сокетов

По мере того, как компьютерный мир все шире объединяется в единую сеть, важность сетевых приложений все больше и больше возрастает. Система Linux предлагает программный интерфейс сокетов Беркли (Беркли), который уже стал стандартным сетевым API. Мы рассмотрим основы использования сокетов Беркли и через сетевой протокол TCP/IP, и через простое межпроцессное взаимодействие (interprocess communication — IPC) с помощью сокетов домена Unix.

Мы не планировали превратить данную главу в полное руководство по программированию для сетей. Это отдельная сложная тема, и для тех программистов, которые планируют серьезную работу с сокетами, мы рекомендуем специализированные книги по программированию для сетей, например, [33]. Этой главы, однако, будет достаточно для того, чтобы вы смогли создавать несложные сетевые приложения.

  • Читать дальше
  • 1
  • ...
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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