logo
Протокол HTTP

2.2.2 Семафоры и мьютексы

Для обеспечения безопасности доступа выполняющихся потоков к разделяемым переменным, коими являются, например, переменные состояния систем журналирования и безопасности, используется механизм взаимоблокировки потоков с помощью объекта ядра - мьютекса.

Мьютекс представляет собой переменную типа pthread_mutex_t, к которой применимы две операции:

· pthread_mutex_lock - захват мьютекса; при применении этой операции к захваченному другим потоком мьютексу вызвавший поток блокируется до освобождения мьютекса.

· pthread_mutex_unlock - освобождение мьютекса.

Для контроля числа одновременно обслуживаемых запросов в серверном модуле применяется объект ядра - семафор.

Семафор представляет собой переменную типа sem_t, к которой применимы две основных операции:

· sem_wait - уменьшает на 1 текущее значение семафора; если текущее значение равно 0, поток блокируется;

· sem_post - увеличивает на 1 значение семафора.

Начальное значение семафора задается при его инициализации с помощью функции sem_init().

2.2.3 Сокеты

Сокет представляет собой объект, предоставляющий программный интерфейс к протоколу TCP/IP и являющийся конечной точкой подключения. Использование сокета ничем не отличается от использования операций ввода-вывода применительно к файловому дескриптору - к сокету применяются те же функции read() и write(), что и при файловом вводе-выводе. Существуют, однако, специфические функции send() и recv(), расширяющие функциональность стандартных read() и write(), но их использование не является обязательным.

Перед началом процесса передачи данных через сокет необходимо совершить ряд действий:

1. Создать переменную типа int, которая будет выступать в качестве дескриптора сокета.

2. Создать описатель адреса сокета - структуру типа sockaddr_in, - и заполнить ее поля в соответствии с адресом и портом, через которые планируется устанавливать соединение.

3. Создать объект «сокет» с помощью функции socket(). Значение, возвращенное функцией, присваивается дескриптору сокета.

4. Привязать сокет к адресу и порту с помощью функции bind().

5. Начать прослушивание адреса и порта на предмет входящих соединений с помощью функции listen().

6. Принимать соединения с помощью функции accept().

Следует заметить, что процедура инициализации клиентского сокета выполняется несколько иначе и не рассматривалась в силу того, что разработанная программа не выступает в качестве клиента.

2.2.4 Сигналы

Контроль сигналов используется в программе для прекращения работы сервера. При поступлении определенного сигнала обнуляется переменная-условие, в результате чего цикл приема сообщений прерывается.

Установка некоторой функции в качестве обработчика сигнала производится следующим образом:

1. Определение функции - обработчика сигнала.

2. Создание и заполнение описателя параметров обработчика - структуры типа sigaction. Одно из полей описателя содержит адрес функции-обработчика.

3. Назначение обработчика сигнала с помощью функции sigaction().