Теория и практика программирования на Си в Unix

       

Управление ошибками


Как уже было указано, сигналы об ошибках реализуются следую- щим образом:
- read () возвращает ноль, если удаленный процесс разрушен или -1, если прервана связь по сети;
- write () вызывает посылку сигнала SIGPIPE, если удаленный процесс разрушен или если связь по сети прервана.
Для проверки работоспособности удаленного процесса можно добавить управление с помощью реле времени (темпоризатора) по вызовам read () или write (). Возможно, что read () никогда не кончит свою работу, если удаленная программа зациклилась, или что вызов займет слишком много времени, если удаленная машина сильно загружена. Возможен аварийный останов программы-клиента. Сервер в этом случае должен контролировать присутствие клиента. Следует установить опцию SO_KEEPALIVE, которую мы рассмотрим в разделе об определении параметров сокетов. Дополнительный контроль можно осуществить следующим образом: сервер периодически осу-ществляет запись байта в контрольный сокет. Таким образом, если клиента больше нет, будет обнаружена ошибка SIGPIPE и сер-вер остановится. Пример использования этого механизма приведен в главе 10 "RPC".

ПРОГРАММА 26 /* Управление сигналом SIGPIPE с помощью опции SO_KEEPALIVE и временной задержкой ****************/

#include "soct.h" #include <signal.h>

/* хэндлер сигнала SIGPIPE */ tsigpipe() { err_quit("SIGPIPE recu \n"); }

/* хэндлер сигнала SIGALRM */ tsigalarm() { err_quit("time out sur lecture ou ecriture \n"); } main() { int sock; /* дескриптор сокета */ int optval; /* значение опции */ int optlen; /* длина optval */ /* установка опции SO_KEEPALIVE */ optlen = sizeof(optval); optval = 1; setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen); /* установка обработчика сигнала SIGPIPE */ signal(SIGPIPE, tsigpipe); /* установка обработчика сигнала SIGALRM */ signal(SIGALRM, tsigalarm); }



Когда функция TLI возвращает ошибку TLOOK, необходимо вызвать функцию tlook () для определения текущего состояния точки доступа транспортной службы.



Содержание раздела