Скачиваний:
56
Добавлен:
08.01.2014
Размер:
2.6 Mб
Скачать

9.3.7. Другие системные вызовы для работы с терминалом

Есть несколько дополнительных системных вызовов для работы с терминалом, позволяющих программисту до некоторой степени управлять очередями ввода и вывода, поддерживаемыми драйвером терминала. Эти вызовы определены следующим образом.

Описание

uses linux;

Function TCFlush(ttyfd, queue:longint):Boolean;

Function TCDrain(ttyfd:longint):Boolean;

Function TCFlow(ttyfd, actions:longint):Boolean;

Function TCSendBreak(ttyfd, duration:longint):longint;

Function TCGetPGrp(Fd:longint;var Id:longint):boolean;

Function TCSetPGrp(Fd,Id:longint):boolean;

Вызов tcflush очищает заданную очередь. Если параметр queue имеет значение TCIFLUSH (определенное в файле stdio), то очищается очередь ввода. Это означает, что все символы в очереди ввода сбрасываются. Если параметр queue имеет значение TCOFLUSH, то очищается очередь вывода. При значении TCIOFLUSH параметра queue очищаются и очередь ввода, и очередь вывода.

Вызов tcdrain приводит к приостановке работы процесса до тех пор, пока текущий вывод не будет записан в терминал ttyfd.

Вызов tсflow обеспечивает старт/стопное управление драйвером терминала. Если параметр actions равен TCOOFF, то вывод приостанавливается. Он может быть возобновлен при помощи еще одного вызова tсflow со значением параметра actions равным TCOON. Вызов tcflow также может использоваться для посылки драйверу терминала специальных символов START и STOP, это происходит при задании значения параметра actions равного TCIOFF или TCION соответственно. Специальные символы START и STOP служат для приостановки и возобновления ввода с терминала.

Вызов TCSendBreak используется для посылки сигнала прерывания сеанса связи, которому соответствует посылка нулевых битов в течение времени, заданного параметром duration. Если параметр duration равен 0, то биты посылаются в течение не менее четверти секунды и не более полсекунды. Если параметр duration не равен нулю, то биты будут посылаться в течение некоторого промежутка времени, длительность которого зависит от значения параметра duration и конкретной реализации.

TCSetPGrp устанавливает, а TCGetPGrp – получает идентификатор группы фоновых процессов, сохраняя его в Id.

9.3.8. Сигнал разрыва соединения

В главе 6 упоминалось, что сигнал разрыва соединения SIGHUP посылается членам сеанса в момент завершения работы лидера сеанса (при условии, что он имеет управляющий терминал). Этот сигнал также имеет другое применение в средах, в которых соединение между компьютером и терминалом может быть разорвано (тогда пропадает сигнал несущей в линии терминала). Это может происходить, например, если терминалы подключены через телефонную сеть или с помощью некоторых типов локальных сетей. В этих обстоятельствах драйвер терминала должен послать сигнал SIGHUP всем процессам, которые считают данный терминал своим управляющим терминалом. Если этот сигнал не перехватывается, то он приводит к завершению работы программы. (В отличие от сигнала SIGINT, сигнал SIGHUP обычно завершает и процесс оболочки. В результате пользователь автоматически отключается от системы при нарушении его связи с системой – такой подход необходим для обеспечения безопасности.)

Обычно программисту не нужно обрабатывать сигнал SIGHUP, так как он служит нужным целям. Тем не менее может потребоваться перехватывать его для выполнения некоторых операций по «наведению порядка» перед выходом из программы; вот как это можно сделать:

uses linux;

procedure hup_action(sig:integer);cdecl;forward;

var

act:sigactionrec;

.

.

.

act.handler.sh:=@hup_action;

sigaction(SIGHUP, @act, nil);

Этот подход используется некоторыми редакторами, сохраняющими редактируемый файл и отсылающими пользователю сообщение перед выходом. Если сигнал SIGHUP полностью игнорируется (установкой значения act.handler.sh равного SIG_IGN) и терминал разрывает соединение, то следующие попытки чтения из терминала будут возвращать 0 для обозначения «конца файла».

Соседние файлы в папке Полищук, Семериков. Системное программирование в UNIX средствами Free Pascal