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().
- 1. Исследовательский раздел
- 1.1 Постановка задачи
- 1.2 Передача данных
- 1.2.1 Протоколы передачи данных
- 1.3 Системная информация ОС Linux
- 1.3.1 Расположение системной информации
- 1.3.2 Файловая система /proc
- 2. Технологический раздел
- 2.1 Выбор языка программирования
- 2.2. Программные средства
- 2.2.2 Семафоры и мьютексы
- 2.3 Структура модулей программы
- 2.3.1 Система инициализации
- 2.3.2 Сервер и система управления динамическими библиотеками
- 2.3.3 Система журналирования
- 2.4 Динамические библиотеки
- 2.4.1 PROCESSES - информация о процессах
- 2.4.2 MEMINFO - информация о системной памяти
- 2.4.3 DISKFREE - информация о свободном месте на дисках
- 2.4.4 NETWORK - информация о сетевых устройствах
- 2.4.5 VERSION - версия операционной системы
- 2.4.6 INDEX - страница помощи
- 2.5 Использование программы
- 2.5.1 Настройка сервера
- 2.5.2 Доступ к серверу
- 2.5.3 Завершение работы сервера