speed 38400 baud; rows 24; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = ;
eol2 = ; swtch = ; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O, min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmirk -inpck -istrip -inlcr -igncr icrnl -ixon -ixoff
-iuclc -ixany -imaxbe1 iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel n10 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke
Среди прочего, как видите, символ EOF— это +, и включено отображение. Экспериментируя с установками терминала, легко получить в результате терминал в нестандартном режиме, что затруднит его дальнейшее использование. Есть несколько способов справиться с этой трудностью.
□ Первый способ — применить следующую команду, если ваша версия sttyподдерживает ее:
$ stty sane
Если вы потеряли преобразование клавиши возврата каретки в символ перехода на новую строку (который завершает строку), возможно, потребуется ввести stty sane, но вместо нажатия клавиши нажать комбинацию клавиш + (которая обозначает переход на новую строку).
□ Второй способ — применить команду stty -gи записать текущие установки sttyв форму, готовую к повторному считыванию. В командной строке вы можете набрать следующее:
$ stty -g > save_stty
...
< эксперименты с параметрами >
...
$ stty $(cat save_stty)
В финальной команде sttyвам все еще придется использовать комбинацию клавиш + вместо клавиши . Ту же самую методику можно применить и в сценариях командной оболочки.
save_stty="$(stty -g)"
< изменение stty-параметров >
stty $save_stty
□ Если вы все еще в тупике, третий способ — перейти на другой терминал, применить команду psдля поиска оболочки, которую вы сделали непригодной, и затем использовать команду kill hup < id процесса >для принудительного завершения этой командной оболочки. Поскольку перед выводом регистрационного приглашения параметры sttyвсегда восстанавливаются, у вас появится возможность нормально зарегистрироваться в системе еще раз.
Задание режимов терминала из командной строки
Вы также можете применять команду sttyдля установки режимов терминалов непосредственно из командной строки.
Для установки режима, в котором ваш сценарий командной оболочки сможет выполнять посимвольное считывание, вы должны отключить канонический режим и задать 1 и 0. Команда будет выглядеть следующим образом:
$ stty -icanon min 1 time 0
Теперь терминал будет считывать символы немедленно, вы можете попробовать выполнить еще раз первую программу menu1. Вы увидите, что она работает, как первоначально и предполагалось.
Вы также могли бы улучшить вашу попытку проверки пароля (см. главу 2), отключив отображение перед приглашением ввести пароль. Команда, выполняющая это действие, должна быть следующей:
$ stty -echo
Примечание
Не забудьте применить команду stty echoдля возврата отображения после ваших экспериментов!
Последняя функция, обслуживаемая структурой termios, — манипулирование скоростью линии передачи. Для этой скорости не определен отдельный элемент структуры; она управляется вызовами функций. Скорости ввода и вывода обрабатываются отдельно.
Далее приведены четыре прототипа вызовов:
#include
speed_t cfgetispeed(const struct termios *);
speed_t cfgetospeed(const struct termios *);
int cfsetispeed(struct termios *, speed_t speed);
int cfsetospeed(struct termios *, speed_t speed);
Обратите внимание на то, что они воздействуют на структуру termios, а не непосредственно на порт. Это означает, что для установки новой скорости вы должны считать текущие установки с помощью функции tcgetattr, задать скорость, применив приведенные вызовы, и затем записать структуру termiosобратно с помощью функции tcsetattr. Скорость линии передачи изменится только после вызова tcsetattr.
В вызовах перечисленных функций допускается задание разных значений скорости speed, но к основным относятся следующие константы:
□ B0— отключение терминала;
□ B1200— 1200 бод;
Читать дальше