Добавил:
twitch.tv Заведующий методическим кабинетом, преподаватель на кафедре компьютерного спорта и прикладных компьютерных технологий. Образование - Магистр Спорта. Суета... Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
7
Добавлен:
29.04.2022
Размер:
11.63 Mб
Скачать

Програмне керування терміналом

Стандарт POSIX визначає набір системних викликів для керування режимами роботи із терміналом. Для задания атрибутів режиму термінального введення-ви­ведення використовують системний виклик tcsetattr( ), а для отримання поточ­них атрибутів режиму – tcgetattr( ). Обидва ці виклики приймають параметром покажчик на структуру termios, яка містить зокрема поле с_ lflag — маску прапор­ців режимів, що керують поведінкою термінала (прапорець ECHO означає роботу в режимі луни):

int tcgetattr(int tfd, struct termios *modes);

int tcsetattr(int tfd, int actions, struct termios *modes):

де: tfd — дескриптор файла, що відповідає терміналу;

actions — час встановлення режиму (TCSAN0W - негайно).

Наведемо приклади використання цих викликів для відключення режиму лу­ни і відновлення попереднього режиму.

#include <termios.h>

#include <sys/types.h>

struct termios new_mode, old_mode;

// одержання поточного режиму

tcgetattr(STDIN_FILENO,&old_mode);

new_mode = old_mode;

// відключення режиму луни

new_mode_lflag &= (~ECHO);

tcsetattr (STDI N_FILENO, TCSANOW, &new_mode);

// ... введення-виведення з використанням STDIN_FILENO без луни

// відновлення попереднього режиму

tcsetattr(STDIN_FIL ENO,TCSANOW,&old jnode);

3.

Основним для термінального введення-виведення у Win32 є поняття консолі . Воно відрізняється від визначеного раніше; фактично консоль - це наданий ОС спеціальний емулятор термінала.

Звичайно консоль пов'язують із конкретним процесом. Для процесів, які за­пускає ОС, консолі пов'язують із консольними процесами, точкою входу для яких є функція main( ). Під час виклику CreateProcess( ) виділення окремої консолі для процесу задається вмиканням прапорця створення CREATE_NEW_CONSOLE. Крім того, кілька процесів можуть спільно використовувати одну й ту саму консоль (на­приклад, після виклику CreateProcess( ) новий процес за замовчуванням успадко­вує консоль предка).

Логічна структура консолі аналогічна до наведеної на рис. 17.1, за винятком того, що з нею може бути пов'язано кілька буферів виводу. Можна виводити дані у різні буфери, а потім перемикатися між ними.

Для роботи із консоллю є два набори функцій. Функції високого рівня дають змогу працювати зі стандартними вводом та виводом і визначати деякі режими керування консоллю. Функції низького рівня дають можливість застосуванням отримувати повну інформацію про інтерактивну роботу користувача із клавіату­рою і мишею. У більшості випадків застосуванню достатньо функцій високого рівня; прикладом застосування, розробленого із використанням функцій низько­го рівня, є файловий менеджер far.

Наперед визначені дескриптори у Win32

Наперед визначені дескриптори у Win32 пов'язані із консоллю. Відмінність від POSIX полягає в тому, що такі дескриптори не відповідають конкретним цілим числам, а завжди є результатом виклику функції GetStdHandle( )

HANDLE GetStdHandle(DWORD std_const);

Параметр std_const визначає, який дескриптор буде повернуто функцією, і за­дається як константа STD_INPUT_HANDLE, STDOUTPUT_HANDLE або STD_ERROR_HANDLE.

char buf[1024]; DWORD bytes-read,bytes_written;

HANDLE stdin, stdout;

// одержати стандартні дескриптори

Stdin - GetStdHandle(STD_INPUT_HANDLE);

stdout = GetStdHandle(STD_OUTPUT_HANDLE);

// зчитати дані з файлу стандартного вводу

ReadFile(stdin, buf, sizeof(buf). &bytes_read, 0);

// вивести їх же у файл стандартного виводу

WriteFile(stdout, buf,Bytes_read, &bytes_written, 0):