Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Для установки атрибутов применяется действие
TCSAFLUSH
Другой распространенный пример использования структуры
termios
MIN
TIME
Применяя только что полученные знания, вы можете изменить программу menu. Приведенная далее программа menu4.c базируется на программе menu3.c и использует большую часть кода из файла password.с, включенного в нее. Внесенные изменения выделены цветом и объясняются в пунктах описания.
1. Прежде всего, вам следует, включить новый заголовочный файл в начало программы:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
<i>#include <termios.h></i>
char *menu[] = {
"a — add new record",
"d — delete record",
"q - quit",
NULL,
};
2. Затем нужно объявить пару новых переменных в функции
main
int getchoice(char *greet, char *choices[], FILE *in, FILE *out);
int main() {
int choice = 0;
FILE *input;
FILE *output;
<i> struct termios initial_settengs, new_settings;</i>
3. Перед вызовом функции
getchoice
if (!isatty(fileno(stdout))) {
fprintf(stderr, "You are not a terminal, OK.n");
}
input = fopen("/dev/tty", "r");
output = fopen("/dev/tty", "w");
if (!input || !output) {
fprintf(stderr, "Unable to open /dev/ttyn");
exit(1);
}
<i> tcgetattr(fileno(input), &initial_settings);</i>
<i> new_settings = initial_settings;</i>
<i> new_settings.c_lfag &= ~ICANON;</i>
<i> new_settings.c_lflag &= ~ECHO;</i>
<i> new_settings.c_cc[VMIN] = 1;</i>
<i> new_settings.c_cc[VTIME] = 0;</i>
<i> new_settings.c_lflag &= ~ISIG;</i>
<i> if (tcsetattr(fileno(input), TCSANOW, &new_settings) != 0) {</i>
<i> fprintf(stderr, "could not set attributesn");</i>
<i> }</i>
4. Перед завершением вы также должны вернуть первоначальные значения:
do {
choice = getchoice("Please select an action", menu, input, output);
printf("You have chosen: %cn", choice);
} while (choice != 'q');
tcsetattr(fileno(input), TCSANOW, &initial_settings);
exit(0);
}
5. Теперь, когда вы в неканоническом режиме, необходимо проверить на соответствие возвраты каретки, поскольку стандартное преобразование CR (возврат каретки) в LF (переход на новую строку) больше не выполняется:
int getchoice (char *greet, char *choices[], FILE *in, FILE *out) {
int chosen = 0;
int selected;
char **option;
do {
fprintf(out, "Choice: %sn", greet);
option = choices;
while (*option) {
fprintf(but, "%sn", *option);
option++;
}
do {
selected = fgetc(in);
<i> } while (selected == 'n' || selected == 'r');</i>
option = choices;
while (*option) {
if (selected == *option[0]) {
chosen = 1;
break;
}
option++;
}
if (!chosen) {
fprintf(out, "Incorrect choice, select againn");
}
} while(!chosen);
return selected;
}
Пока вы не устроите все иначе, теперь, если пользователь нажмет в вашей программе комбинацию клавиш <Ctrl>+<C>, программа завершится. Вы можете отключить обработку этих специальных символов, очистив флаг
ISIG
main
<i>new_settings.c_lflag &= ~ISIG;</i>
Если вы внесете эти изменения в вашу программу меню, то будете получать немедленный отклик, и вводимый вами символ не будет отображаться на экране.