Курсовая работа: Протокол HTTP
Создание потока разбивается на несколько этапов:
1. Описание функции, которая будет выполняться в рамках потока. Эта функция не должна содержать статических переменных.
2. Создание экземпляра описателя атрибутов потока – структуры типа pthread_attr_t, – и заполнение ее полей в соответствии с необходимыми свойствами создаваемого потока.
3. Создание переменной типа pthread_t, которая будет служить идентификатором создаваемого потока.
4. Создание потока с помощью функции pthread_create(), в которую передается указатель на идентификатор потока, указатель на описатель атрибутов потока, а также адрес поточной функции и ее аргумент.
После создания поток выполняется параллельно с остальными потоками процесса и завершает свою работу при выполнении в поточной функции оператора return или принудительном завершении извне.
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. Определение функц?