-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 $save_stty
Если вы все еще в тупике, третий способ — перейти на другой терминал, применить команду ps
для поиска оболочки, которую вы сделали непригодной, и затем использовать команду kill hup <
для принудительного завершения этой командной оболочки. Поскольку перед выводом регистрационного приглашения параметры stty
всегда восстанавливаются, у вас появится возможность нормально зарегистрироваться в системе еще раз.
Вы также можете применять команду stty
для установки режимов терминалов непосредственно из командной строки.
Для установки режима, в котором ваш сценарий командной оболочки сможет выполнять посимвольное считывание, вы должны отключить канонический режим и задать 1 и 0. Команда будет выглядеть следующим образом:
$ stty -icanon min 1 time 0
Теперь терминал будет считывать символы немедленно, вы можете попробовать выполнить еще раз первую программу menu1. Вы увидите, что она работает, как первоначально и предполагалось.
Вы также могли бы улучшить вашу попытку проверки пароля
$ 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
.