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

Троан Эрик В.

Шрифт:

205: sts.c_cc[VTIME] = 0;

206: sts.c_lflag &= ~ICANON;

207: /* нет локального эхо: разрешить эхо-контроль на другом конце */

208: sts.c_lflag &= ~(ECHO | ECHOCTL | ECHONL);

209:

210: /* обработка опций сейчас будет модифицировать pts и sts */

211: switch (flow) {

212: case 'h' :

213: /* аппаратное управление потоком */

214: pts.c_cflag |= CRTSCTS;

215: pts.c_iflag &= ~(IXON | IXOFF | IXANY);

216: break;

217: case 's':

218: /* программное управление потоком */

219: pts.c_cflag &= ~CRTSCTS;

220: pts.c_iflag |= IXON | IXOFF | IXANY;

221: break;

222: case 'n':

223: /* отключение управления потоком */

224: pts.c_cflag &= ~CRTSCTS;

225: pts.c_iflag &= ~(IXON | IXOFF | IXANY);

226: break;

227: }

228: if (crnl) {

229: /* послать CR с NL */

230: pts.c_oflag |= ONLCR;

231: }

232:

233: /* скорость не изменяется, пока не будет указано -b */

234: if (speed) {

235: cfsetospeed(&pts, symbolic_speed(speed));

236: cfsetispeed(&pts, symbolic_speed(speed));

237: }

238:

239: /* установить обработчик сигналов для восстановления

240: * старого обработчика termios */

241: sact.sa_handler = cleanup_termios;

242: sigaction(SIGHUP, &sact, NULL);

243: sigaction(SIGINT, &sact, NULL);

244: sigaction(SIGPIPE, &sact, NULL);

245: sigaction(SIGTERM, &sact, NULL);

246:

247: /* установить измененные настройки termios */

248: tcsetattr(pf, TCSANOW, &pts);

249: tcsetattr(STDIN_FILENO, TCSANOW, &sts);

250:

251: ufds[0].fd = STDIN_FILENO;

252: ufds[0].events = POLLIN;

253: ufds[1].fd = pf;

254: ufds[1].events = POLLIN;

255:

256: do {

257: int r;

258:

259: r = poll(ufds, 2, -1);

260: if ((r < 0) && (errno != EINTR))

261: die(1, "неожиданный сбой poll", "");

262:

263: /* сначала проверить возможность завершения */

264: if ((ufds[0].revents | ufds[1].revents) &

265: (POLLERR | POLLHUP | POLLNVAL)) {

266: done = 1;

267: break;

268: }

269:

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

271: /* pf содержит символы */

272: i = read (pf, buf, BUFSIZE);

273: if (i >= 1) {

274: write(STDOUT_FILENO, buf, i);

275: } else {

276: done = 1;

277: }

278: }

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

280: /* стандартный ввод содержит символы */

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

282: if (i >= 1) {

283: if (raw) {

284: write(pf, buf, i);

285: } else {

286: cook_buf(pf, buf, i);

287: }

288: } else {

  • Читать дальше
  • 1
  • ...
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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