Глобальные переменные, применяемые для хранения информации о состоянии

Опубликовано в Технологии > Серверные технологии Продолжение

Объявление глобальной переменной oldtty, наряду с другими глобальными переменными, относящимися к локальному терминалу, находится в файле local.h. Кроме того, этот файл содержит объявления функций errexit, ttwrite, sowrite и f smbuild, которые описаны далее в этой главе.

В этом коде переменная oldtty объявлена как структура типа termios, которая определена в системе как состоящая из шести полей:

struct termios { tcflag_t c_iflag; /* Параметры ввода с терминала */
tcflag_t c_oflag;   /* Параметры ввода/вывода на терминал */
tcflag_t c_cflag;   /* Параметры управления терминалом */
tcflag_t cJLflag;   /* Параметры работы линии связи */
char c_line;	/* Режим работы линии связи */
cc_t с_сс[17];       /* Управляющие символы */

Восстановление параметров работы терминала перед выходом из программы

С началом работы клиентская программа сохраняет первоначальные параметры работы терминала в переменной oldtty. Перед завершением работы в клиентской программе вызывается процедура ttyrestore для восстановления записанных ранее параметров работы терминала. В частности, процедура dcon разрывает соединение TCP с сервером; в клиентской программе процедура dcon вызывается при получении от пользователя запроса на прекращение сеанса. Процедура dcon выводит сообщение, восстанавливает первоначальные параметры работы терминала и выполняет нормальное завершение работы (т.е. в ней используется код завершения 0). Файл dcon.с содержит следующий код:

int
dcon(FILE *sfp, FILE *tfp, int c) {
fprintf(tfp, "disconnecting.\n"); (void) tcsetattr(0, TCSADRAIN, Soldtty); exit(0);
}

В этом коде предусмотрено, что в случае возникновения любой неисправимой ошибки работа клиентской программы должна быть завершена. Перед завершением работы клиентской программы должны быть восстановлены первоначальные параметры терминала, так как в противном случае пользовательский терминал не будет действовать обычным образом. Необходимый для этого код содержится в файле cerrexit.c.

int
cerrexit(const char *format, ...) {
va_list args;
va_start(args, format);
vfprintf(stderr, format, args);
(void) tcsetattr(Or TCSADRAIN, ioldtty);
va end(args);
exlt(l);
}

Процедура cerrexit, как и dcon, выводит сообщение и восстанавливает параметры терминала перед завершением своей работы. Однако в процедуре cerrexit, в отличие от dcon, для указания на аварийное завершение используется код завершения 1.

Приостановка и возобновление работы клиентской программы

Операционная система Linux позволяет пользователю приостановить на время работу программы. Пока программа находится в приостановленном состоянии, управление пользовательским терминалом возвращается к другому процессу, обычно к командному интерпретатору. При получении клиентом TELNET сигнала, вызывающего приостановку процесса, он должен восстановить перед приостановкой первоначальные параметры терминала, а затем снова установить значения этих параметров, применяемые в клиентской программе после возобновления процесса. Файл suspend.с содержит код функции suspend, которая восстанавливает первоначальные параметры терминала перед приостановкой клиентского процесса. После возобновления работы клиентской программы функция suspend снова берет на себя управление, восстанавливает параметры терминала и возвращает управление вызывающей процедуре.

/* Файл suspend - процедура suspend */
tinclude  tinclude 
tinclude  tinclude 
tinclude "local.h"
extern struct termios tntty;