Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² срСдС Linux. Π’Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 79

Автор Майкл ДТонсон

111:

112: int main(int argc, const char * argv[]) {

113:  char с; /* ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ€Π°Π·Π±ΠΎΡ€Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² */

114:  struct termios pts; /* настройки termios для ΠΏΠΎΡ€Ρ‚Π° */

115:  struct termios sts; /* настройки termios для stdout/stdin */

116:  const char *portname;

117:  int speed = 0; /* ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ Ρ€Π°Π·Π±ΠΎΡ€Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² для скорости */

118:  struct sigaction sact; /* ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° сигналов */

119:  struct pollfd ufds[2]; /* взаимодСйствиС с poll() */

120:  int raw = 0; /* Π½Π΅Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ? */

121:  int flow = 0; /* Ρ‚ΠΈΠΏ управлСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, Ссли примСняСтся*/

122:  int crnl = 0; /* ΠΏΠΎΡΡ‹Π»Π°Ρ‚ΡŒ Π»ΠΈ символ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΊΠ°Ρ€Π΅Ρ‚ΠΊΠΈ с символом Π½ΠΎΠ²ΠΎΠΉ строки? */

123:  int i = 0; /* ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Ρ†ΠΈΠΊΠ»Π΅ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ*/

124:  int done = 0; 125: # define BUFSIZE 1024

126:  char buf[BUFSIZE];

127:  poptContext optCon; /* контСкст ΠΎΠΏΡ†ΠΈΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки */

128:  struct poptOption optionsTable[] = {

129:   { "bps", 'b', POPT_ARG_INT, &speed, 0,

130:     "ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ сигналов, Π±ΠΈΡ‚/с",

131:     "<BPS>" },

132:   { "crnl", 'с', POPT_ARG_VAL, &crnl, 'с',

133:     "ΠΏΠΎΡΡ‹Π»Π°Ρ‚ΡŒ символ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΊΠ°Ρ€Π΅Ρ‚ΠΊΠΈ с символом Π½ΠΎΠ²ΠΎΠΉ строки", NULL },

134:   { "hwflow", 'h', POPT_ARG_VAL, &flow, 'h',

135:     "ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ", NULL },

136:   { "swflow", 's', POPT_ARG_VAL, &flow, 's',

137:     "ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ", NULL },

138:   { "noflow", 'n', POPT_ARG_VAL, &flow, 'n',

139:     "ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ", NULL },

140:   { "raw", 'r', POPT_ARG_VAL, &raw, 1,

141:     "Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π½Π΅Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ", NULL },

142:   POPT_AUTOHELP

143:   { NULL, '\0', 0, NULL, '\0', NULL, NULL }

144:  };

145:

146: #ifdef DSLEEP

147:  /* ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ 10 ΠΌΠΈΠ½ΡƒΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ */

148:  sleep(600);

149: #endif

150:

151:  optCon = poptGetContext("robin", argc, argv, optionsTable, 0);

152:  poptSetOtherOptionHelp(optCon, "<port>");

153:

154:  if (argc < 2) {

155:   poptPrintUsage(optCon, stderr, 0);

156:   die(1, "He достаточно Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²", "");

157:  }

158:

159:  if ((с = poptGetNextOpt(optCon)) < -1) {

160:   /* ошибка Π²ΠΎ врСмя ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΎΠΏΡ†ΠΈΠΉ */

161:   fprintf(stderr, "%s: %s\n",

162:    poptBadOption(optCon, POPT_BADOPTION_NOALIAS),

163:    poptStrerror(c));

164:   return 1;

165:  }

166:  portname = poptGetArg(optCon);

167:  if (!portname) {

168:   poptPrintUsage(optCon, stderr, 0);

169:   die(1, "He ΡƒΠΊΠ°Π·Π°Π½ΠΎ имя ΠΏΠΎΡ€Ρ‚Π°", "");

170:  }

171:

172:  pf = open(portname, O_RDWR);

173:  if (pf < 0) {

174:   poptPrintUsage(optCon, stderr, 0);

175:   die(1, strerror(errno), portname);

176:  }

177:  poptFreeContext(optCon);

178:

179:  /* ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ ΠΏΠΎΡ€Ρ‚Π° */

180:  tcgetattr(pf, &pts);

181:  pots = pts;

182:  /* Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ настройки ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎ */

183:  pts.c_lflag &= ~ICANON;

184:  pts.c_lflag &= ~(ECHO | ECHOCTL | ECHONL);

185:  pts.c_cflag |= HUPCL;

186:  pts.c_cc[VMIN] = 1;

187:  pts.c_cc[VTIME] = 0;

188:

189:  /* Бтандартная ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° CR/LF: это Π½Π΅ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π».

190:   * НС транслируСтся:

191:   * Π½Π΅Ρ‚ NL -> ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ CR/NL Π² Π²Ρ‹Π²ΠΎΠ΄Π΅,

192:   * Π½Π΅Ρ‚ CR -> ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ NL Π²ΠΎ Π²Π²ΠΎΠ΄Π΅.

193:   */

194:  pts.c_oflag &= ~ONLCR;

195:  pts.c_iflag &= ~ICRNL;

196:

197:  /* Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° сторону локального Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° */

198:  tcgetattr(STDIN_FILENO, &sts);

199:  sots = sts;

200:  /* ΠΈ снова нСсколько ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… настроСк */

201:  sts.c_iflag &= ~(BRKINT | ICRNL);

202:  sts.c_iflag |= IGNBRK;

203:  sts.c_lflag &= ~ISIG;

204:  sts.c_cc[VMIN] = 1;

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 {

289:     done = 1;

290:    }

291:   }

292:  } while (!done);

293:

294:  /* Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ настройки Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ*/

295:  tcsetattr(pf, TCSANOW, &pots);

296:  tcsetattr(STDIN_FILENO, TCSANOW, &sots);

297:  exit(0);

298: }

Код robin.с начинаСтся с Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² (ΠΏΠΎΡ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ man-страницы для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ систСмного Π²Ρ‹Π·ΠΎΠ²Π° ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ), Π° Π·Π°Ρ‚Π΅ΠΌ Π² Π½Π΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ нСсколько ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

Ѐункция symbolic_speed() Π² строкС 19 ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Ρ†Π΅Π»ΠΎΡ‡ΠΈΡΠ»Π΅Π½Π½ΡƒΡŽ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Π² ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ termios. К соТалСнию, termios Π½Π΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ скоростями, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ каТдая ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒΡŽ интСрфСйса ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ β€” ядро[110].

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ прСдусмотрСны ΠΈ довольно высокиС скорости. НС всС ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ€Ρ‚Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ скорости 230 400 ΠΈΠ»ΠΈ 460 800 Π±ΠΈΡ‚/с; Π² стандартС POSIX ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ скорости лишь Π΄ΠΎ 38 400 Π±ΠΈΡ‚/с. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ пСрСносимой, ΠΊΠ°ΠΆΠ΄ΡƒΡŽ строку Π½Π°Π΄ строкой, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ устанавливаСтся ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ 38 400 Π±ΠΈΡ‚/с, потрСбуСтся Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ Π΄ΠΎ Ρ‚Ρ€Π΅Ρ… строк, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:

#ifdef Π’460800

if (speednum >= 460800) return B46000;

#end if

Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ скорости Π²Ρ‹ΡˆΠ΅ Ρ‚Π΅Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ€Ρ‚Ρ‹ способны ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ, Π° исходный ΠΊΠΎΠ΄ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² любой систСмС с POSIX termios. (Как ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Ρ€Π°Π½Π΅Π΅ Π² этой Π³Π»Π°Π²Π΅, любой ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΡ€Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π»ΡŽΠ±ΡƒΡŽ установку termios, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½ Π½Π΅ способСн ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Ρ‚Π°ΠΊΠΆΠ΅ установки скорости. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ установка B460800 Π½Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΏΠΎΡ€Ρ‚Π° Ρ€Π°Π²Π½ΠΎΠΉ 460 800 Π±ΠΈΡ‚/с.)

Π’ строках 44β€”55 ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ сигналов ΠΈ сам ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигналов. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигналов ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для восстановлСния настроСк termios Π½Π° ΠΎΠ±ΠΎΠΈΡ… интСрфСйсах tty ΠΏΡ€ΠΈ доставкС сигнала, поэтому Π΅ΠΌΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ структурам, содСрТащим старыС настройки termios. Π•ΠΌΡƒ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π½Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΉ дСскриптор ΠΈΠ»ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΡ€Ρ‚ (Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΉ дСскриптор для стандартных Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ мСняСтся, поэтому компилируСтся Π² Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ). Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π΅Π½ ΠΊΠΎΠ΄Ρƒ Π² случаС Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ рассматриваСтся ΠΏΠΎΠ·ΠΆΠ΅. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигналов Π·Π°Ρ‚Π΅ΠΌ прикрСпляСтся ΠΊ сигналам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ процСсс, Ссли ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹.