Читаем Основы программирования в Linux полностью

-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 для возврата отображения после ваших экспериментов!

<p>Скорость терминала</p>

Последняя функция, обслуживаемая структурой 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.

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже