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

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

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

НСкоторыС систСмы Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈΠΌ символа Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΊΠ°Ρ€Π΅Ρ‚ΠΊΠΈ для прСдставлСния Π½ΠΎΠ²ΠΎΠΉ строки. Π‘Π»ΠΎΠ²ΠΎ "систСмы" здСсь слСдуСт ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ; Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, это ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ ΠΊΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌ ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠΉΠ½Ρ‹ΠΌ устройствам, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, источникам бСспСрСбойного питания (UPS) с ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠΎΡ€Ρ‚Π°ΠΌΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для функционирования Π² DOS, Π³Π΄Π΅ ΠΏΠ°Ρ€Π° "Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΊΠ°Ρ€Π΅Ρ‚ΠΊΠΈ/ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ строки" всСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для обозначСния Π½ΠΎΠ²ΠΎΠΉ строки. Π’ строкС 228 опрСдСляСтся это DOS-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.

228: if (crnl) {

229:  /* ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ CR с NL */

230:  pts.c_oflag |= ONLCR;

231: }

ПослСдняя Ρ‡Π°ΡΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΎΠΏΡ†ΠΈΠΉ управляСт ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π² Π±ΠΈΡ‚Π°Ρ… Π² сСкунду[111]. ВмСсто Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ³ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° Π²Ρ‹Π±ΠΎΡ€Π° ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΡƒΠΆΠ΅ ΠΎΠΏΠΈΡΠ°Π½Π½ΡƒΡŽ Ρ€Π°Π½Π΅Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ symbolic_speed(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ speed_t, ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΠΌΡ‹ΠΉ termios, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² строкС 233.

233: /* ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Π½Π΅ измСняСтся, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½ΠΎ -b */

234: if (speed) {

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

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

237: }

ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ Π·Π°Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ измСнСния Π½Π°ΡˆΠΈΡ… ΠΊΠΎΠΏΠΈΠΉ структур termios, Π² строкС 241 Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ для Π²Π°ΠΆΠ½Ρ‹Ρ… сигналов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠ΅ процСсса ΠΈ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ tty Π² Π½Π΅Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΌ состоянии. Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ сигналов Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² Π³Π»Π°Π²Π΅ 12.

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);

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигналов окаТСтся Π½Π° мСстС для восстановлСния старых настроСк termios Π² случаС уничтоТСния robin, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π±Π»Π°Π³ΠΎΠΏΠΎΠ»ΡƒΡ‡Π½ΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ установки termios.

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

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

На этом этапС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° robin Π³ΠΎΡ‚ΠΎΠ²Π° Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ символы. Π£ robin Π΅ΡΡ‚ΡŒ Π΄Π²Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… дСскриптора для чтСния: Π΄Π°Π½Π½Ρ‹Π΅ с ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡ€Ρ‚Π° ΠΈ Π΄Π°Π½Π½Ρ‹Π΅ с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹. Для ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‡Π΅Ρ‚Ρ‹Ρ€ΡŒΠΌΡ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΌΠΈ дСскрипторами ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ poll() (см. Π³Π»Π°Π²Ρƒ 13).

Π¦ΠΈΠΊΠ» poll() Π΄Π΅Π»Π°Π΅Ρ‚ упрощСнчСскоС ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ всСгда ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ, сколько Π² состоянии ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ. Π­Ρ‚ΠΎ ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда Π²Π΅Ρ€Π½ΠΎ ΠΈ Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Ρ‹ Π½Π΅Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ ΠΏΡ€ΠΈ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… условиях. Π¦ΠΈΠΊΠ» Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ считываСт ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ дСскриптора, ΠΏΠΎΠΊΠ° poll() Π½Π΅ сообщит, Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΉ дСскриптор ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ считывания Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ Π·Π½Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π²ΠΎ врСмя чтСния Π½Π΅Ρ‚.

Для Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΡ… с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ ΠΏΠ΅Ρ€Π΅Π΄ записью, Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ Π²Ρ‹Π±Ρ€Π°Π» Π½Π΅Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ ΠΏΡ€ΠΈ запускС robin. ВмСсто Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ этого ΠΊΠΎΠ΄Π° Π² Ρ†ΠΈΠΊΠ» ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ cook_buf() (строка 78), которая ΠΏΡ€ΠΈ нСобходимости обращаСтся ΠΊ send_escape() (строка 58). ОбС эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ просты. ЕдинствСнный Ρ‚Ρ€ΡŽΠΊ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ cook_buf() ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Π° ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· с ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΌ символом, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π· с ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌ символом, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π² ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ количСства Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ write().

Ѐункция cook_buf() Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ send_escape() ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ символа, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΠ΅Ρ‚ нСотмСняСмый ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ символ ^\. Π‘ΠΈΠΌΠ²ΠΎΠ» q восстанавливаСт исходныС установки termios ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° сигнала (с Ρ„Π°Π»ΡŒΡˆΠΈΠ²Ρ‹ΠΌ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ сигнала 0), Ρ‡Ρ‚ΠΎ восстанавливаСт настройки termios ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠΌ. Π‘ΠΈΠΌΠ²ΠΎΠ» b Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ состояниС Ρ€Π°Π·Ρ€Ρ‹Π²Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ являСтся Π΄Π»ΠΈΠ½Π½ΠΎΠΉ строкой, состоящСй ΠΈΠ· Π½ΡƒΠ»Π΅ΠΉ. Π›ΡŽΠ±ΠΎΠΉ Π΄Ρ€ΡƒΠ³ΠΎΠΉ символ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ символ ^\, пСрСдаСтся Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΡ€Ρ‚ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.

Если ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΈΠ· Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… дСскрипторов Π²Π΅Ρ€Π½Π΅Ρ‚ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ ΠΊΠΎΠ½Ρ†Π° Ρ„Π°ΠΉΠ»Π°, robin Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· Ρ†ΠΈΠΊΠ»Π° poll() ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, Ρ‡Ρ‚ΠΎ соотвСтствуСт ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ сигнала: восстановлСниС старых настроСк termios Π½Π° ΠΎΠ±ΠΎΠΈΡ… Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… дСскрипторов ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅. Π’ Π½Π΅Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ сущСствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π° способа Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ robin: Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… дСскрипторов ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅ΠΉ сигнал.

16.4. ΠžΡ‚Π»Π°Π΄ΠΊΠ° termios

ΠžΡ‚Π»Π°Π΄ΠΊΠ° ΠΊΠΎΠ΄Π° tty Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ всСгда проста. Π’Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‚ΡΡ ΠΈ Π²Π»ΠΈΡΡŽΡ‚ Π΄Ρ€ΡƒΠ³ Π½Π° Π΄Ρ€ΡƒΠ³Π° Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ способами, часто Π½Π΅Π·Π°ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ. Но с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ лишь ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ происходит, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹ ΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ, происходит Π² ядрС.

Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ способом ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΊΠΎΠ΄Π°, ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΡ€Ρ‚, являСтся использованиС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹-сцСнария. Π’ΠΎ врСмя Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ robin ΠΌΡ‹ соСдинили Π΄Π²Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΊΠ°Π±Π΅Π»Π΅ΠΌ ΠΈ ΡƒΠ±Π΅Π΄ΠΈΠ»ΠΈΡΡŒ, Ρ‡Ρ‚ΠΎ соСдинСниС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, запустив ΠΈΠ·Π²Π΅ΡΡ‚Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ kermit. Π’ Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° kermit ΡƒΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π»Π° Π½Π° локальном ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅, ΠΌΡ‹ запустили ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ-сцСнарий Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅, которая Π½Π°Ρ‡Π°Π»Π° Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС символы Π² Ρ„Π°ΠΉΠ»Π΅. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ Π²Ρ‹ΡˆΠ»ΠΈ ΠΈΠ· kermit ΠΈ запустили сцСнарий Π½Π° локальном ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅, помСстив ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π² Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π½Π° мСстном ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π»ΠΈΡΡŒ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ robin ΠΏΠΎ ΡΡ†Π΅Π½Π°Ρ€ΠΈΡŽ ΠΈ сравнили Π΄Π²Π° Ρ„Π°ΠΉΠ»Π° Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΈ послС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ запуска, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ Π² символах. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΡ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ с эффСктами Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Ρ… ΠΎΠΏΡ†ΠΈΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ прСимущСства ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ stty. Если Π²ΠΎ врСмя ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²Ρ‹ распознаСтС ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² настройках termios, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ stty для Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ³ΠΎ внСсСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ вмСсто ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ компиляции своСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Если Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ Π½Π° /dev/ttyS0 ΠΈ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ„Π»Π°Π³ ECHOCTL, просто Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ своСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ запуститС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

stty echoctl < /dev/ttyS0

ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΠΎΡ€Ρ‚Π°:

stty -Π° < /dev/ttyS0

Как объяснялось Ρ€Π°Π½Π΅Π΅, Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ tty для запуска ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ искаТСния tty, которая отлаТиваСтся. ВмСсто этого слСдуСт ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ ΠΊ процСссу. Π­Ρ‚ΠΎ Π½Π΅ слоТно. Π’ ΠΎΠ΄Π½ΠΎΠΌ сСансС X-Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° (Π΄Π΅Π»Π°ΠΉΡ‚Π΅ это ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ X Window, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΎΠ±Π° tty) запуститС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡΠΎΠ±ΠΈΡ€Π°Π΅Ρ‚Π΅ΡΡŒ ΠΎΡ‚Π»Π°Π΄ΠΈΡ‚ΡŒ. Π’ случаС надобности помСститС Π΅Π΅ Π² Π΄ΠΎΠ»Π³ΠΈΠΉ Ρ€Π΅ΠΆΠΈΠΌ оТидания Π² Ρ‚ΠΎΡ‡ΠΊΠ΅, Π³Π΄Π΅ Π²Ρ‹ ΡΠΎΠ±ΠΈΡ€Π°Π΅Ρ‚Π΅ΡΡŒ ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ ΠΊ процСссу:

$ ./robin -b 38400 /dev/ttyS1

Π’Π΅ΠΏΠ΅Ρ€ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ сСанса X-Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° Π½Π°ΠΉΠ΄ΠΈΡ‚Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ процСсса ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ ΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ ΠΎΡ‚Π»Π°Π΄ΠΈΡ‚ΡŒ, ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π΄Π²ΡƒΡ… способов:

$ ps | grep robin

30483 ? S 0:00 ./robin - b 38400 /dev/ttyS1

30485 ? S 0:00 grep robin

$ pidof robin

30483

Π‘ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ являСтся pidof, Π½ΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСдоступСн Π² систСмС. Π—Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅ Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€ (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС 30483) ΠΈ Π½Π°Ρ‡Π½ΠΈΡ‚Π΅ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ сСанс ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ.

$ gdb robin 30483

GDB is free software...

...

Attaching to program '... /robin', process 30483

Reading symbols from...

0x40075d88 in sigsuspend()

Π”Π°Π»Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠΈ прСрывания ΠΈ слСТСния, пошагово Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

16.5. Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ ΠΏΠΎ termios

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ termios состоит ΠΈΠ· структуры, Π½Π°Π±ΠΎΡ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… с нСю, ΠΈ мноТСства Ρ„Π»Π°Π³ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈΡ‡Π½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ.

#include <termios.h>


struct termios {

 tcflag_t c_iflag; /* Ρ„Π»Π°Π³ΠΈ Ρ€Π΅ΠΆΠΈΠΌΠ° Π²Π²ΠΎΠ΄Π° */

 tcflag_t c_oflag; /* Ρ„Π»Π°Π³ΠΈ Ρ€Π΅ΠΆΠΈΠΌΠ° Π²Ρ‹Π²ΠΎΠ΄Π° */

 tcflag_t c_cflag; /* Ρ„Π»Π°Π³ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ° */ tcflag_t c_lflag; /* Ρ„Π»Π°Π³ΠΈ локального Ρ€Π΅ΠΆΠΈΠΌΠ° */

 cc_t c_line; /* дисциплина Π»ΠΈΠ½ΠΈΠΈ связи */

 cc_t c_cc[NCCS]; /* ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ символы */

};

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ c_line ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ лишь Π² систСмных спСцифичСских прилоТСниях[112], выходящих Π·Π° Ρ€Π°ΠΌΠΊΠΈ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π° Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³ΠΈ. Однако ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡΡ‚ΡŒ элСмСнтов ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΊΠΎ всСм ситуациям, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠΌ манипулирования настройками Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°.

16.5.1. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ termios опрСдСляСт нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ВсС ΠΎΠ½ΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π² <termios.h>. Π§Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΈΠ· Π½ΠΈΡ… ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌΠΈ функциями для пСрСносимого манипулирования структурой struct termios; ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ΡΡ с cf, ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌΠΈ, Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ΡΡ с tc β€” систСмными Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ управлСния Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠΌ. ВсС систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ управлСния Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠΌ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ SIGTTOU, Ссли процСсс Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Ρ„ΠΎΠ½Π΅ ΠΈ пытаСтся ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ своим ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠΌ (см. Π³Π»Π°Π²Ρƒ 15).

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½ΠΎ, эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ 0 Π² случаС успСха ΠΈ -1 ΠΏΡ€ΠΈ ошибкС. Π’Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для управлСния Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠΌ, описаны Π½ΠΈΠΆΠ΅.