Разбираюсь к кодом программы, написанной на C под Linux.
Попались функции tcsetattr и fcntl. Немного разобрался с их работой и предназначением сам, но очень смутно. Не могли бы вы объяснить для чего они предназначены и принцип их работы (а именно, как зависит их работа от аргументов).
Если не ошибаюсь, то tcsetattr() устанавливает настройки терминального устройства, такого как консоль, ком-порт и т.д. fcntl() это функция позволяющая различные низкоуровневые манипуляции над файловыми дескрипторами.
Так же возник вопрос о том, что выполняет конструкция ниже? Что обозначает 0 - третий аргумент первой ф-ии?
Что обозначает выражение kbh_oldf | O_NONBLOCK?
С первыми двумя аргументами ф-ии fcntl разобрался, кажись. Первый - это файловый дескриптор, второй - команда, которую нужно выполнить: либо извлечь значения флагов(F_GETFL), либо записать новые значения (F_SETFL)
kbh_oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
fcntl(STDIN_FILENO, F_SETFL, kbh_oldf | O_NONBLOCK);
мне кажется, что в первом вызове fcntl() часть ", 0" - лишняя, команда F_GETFL не требует дополнительного параметра.
а по сути, как я понимаю, для файлового дескриптора включается режим неблокированного ввода. Это, имхо, можно было сделать более явно, через ioctl():
int flag = 1;
ioctl(STDIN_FILENO, FIONBIO, &flag);
Впрочем, подход через fcntl() считается более стандартным.
Так же интересует какую роль играет ф-ия tcgetattr(STDIN_FILENO, &kbh_oldt);
Функция tcgetattr() запрашивает текущие настройки терминала, а tcsetattr() из устанавливает.
И последнее в этой теме:
Для чего используются структуры termios?
static struct termios kbh_oldt;
static struct termios kbh_newt;
static int kbh_oldf = 0;
kbh_newt.c_lflag &= ~(ICANON | ECHO); // Какое действие выполняет это выражение?
В настройках терминала отключается канонический режим (редактирование командной строки и т.д.) и автоматический вывод вводимых символов на экран.