sem_overview - обзор
семафоров POSIX
Семафоры POSIX
позволяют
процессам
и нитям
синхронизировать
свою
работу.
Семафор
представляет
собой
целое
число,
значение
которого
никогда не
будет
меньше
нуля. Над
семафорами
выполняются
две
операции:
увеличение
значения
семафора
на единицу (
sem_post(3)) и
уменьшение
значения
семафора
на единицу (
sem_wait(3)). Если
значение
семафора
равно нулю,
то
операция
sem_wait(3)
блокирует
работу до
тех пор,
пока
значение
не станет
больше
нуля.
Есть два
вида
семафоров
POSIX:
именованные
семафоры и
безымянные
семафоры.
- Именованные
семафоры
- Именованные
семафоры
отличают
по именам
вида /имя —
строка (с null в
конце) до
NAME_MAX-4 (т. е., 251)
символов,
состоящая
из
начальной
косой
черты и
одного или
нескольких
символов
(символ
косой
черты не
допускается).
Два
процесса
могут
работать с
одним
семафором
указав его
имя в sem_open(3).
- Функция
sem_open(3)
создаёт
новый
именованный
семафор
или
открывает
существующий.
После
открытия
семафора с
ним можно
работать
посредством
sem_post(3) и sem_wait(3).
Когда
процесс
закончил
использовать
семафор,
его можно
закрыть с
помощью
sem_close(3). Когда
все
процессы
закончили
использовать
семафор,
его можно
удалить из
системы с
помощью
sem_unlink(3).
- Безымянные
семафоры
(семафоры в
памяти)
- Безымянные
семафоры
не имеют
имени.
Семафор
размещается
в области
памяти,
которая
доступна
нескольким
нитям (
общий
семафор
для нитей)
или
процессам (
общий
семафор
для
процессов).
Общий
семафор
для нитей
размещается
в области
памяти,
которая
доступна
из нитей
процесса,
например в
глобальной
переменной.
Общий
семафор
для
процессов
должен
размещаться
в области
общей
памяти
(например,
в сегменте
общей
памяти System V,
созданной
с помощью
shmget(2), или в
объекте
общей
памяти POSIX,
созданном
с помощью
shm_open(3)).
- Перед
началом
использования
безымянный
семафор
должны
быть
проинициализирован
с помощью
sem_init(3). После
этого с ним
можно
работать
через sem_post(3) и
sem_wait(3). Если
семафор
больше не
нужен, то
семафор
нужно
уничтожить
с помощью
sem_destroy(3) (но до
освобождения
выделенной
для него
памяти).
Далее в
разделе
описываются
особенности
реализации
семафоров POSIX
в Linux.
Before Linux 2.6, Linux supported only unnamed, thread-shared semaphores. On a
system with Linux 2.6 and a glibc that provides the NPTL threading
implementation, a complete implementation of POSIX semaphores is provided.
Именованные
семафоры POSIX
располагаются
в ядре. Пока
семафор не
удалён с
помощью
sem_unlink(3),
он
остаётся в
системе до
её
выключения.
Программы,
в которых
используется
программный
интерфейс
семафоров
POSIX, для
компоновки
с
библиотекой
реального
времени
librt
должны
компилироваться
с помощью
cc
-pthread.
В Linux,
именованные
семафоры
создаются
в
виртуальной
файловой
системе,
обычно
монтируемой
в
/dev/shm, с
именами
вида
sem.имя
(по этой
причине
длина
имени
семафора
ограничена
NAME_MAX-4, а не
NAME_MAX
символами).
Начиная с Linux 2.6.19,
для
управления
доступом к
объектам
конкретным
пользователям
или
группам на
файлы в
этом
каталоге
могут быть
применены ACL.
Семафоры System V (
semget(2),
semop(2) и т. п.) —
это старый
программный
интерфейс
семафоров.
Семафоры POSIX
предоставляют
более
простой и
продуманный
интерфейс
чем
семафоры System V;
с другой
стороны,
семафоры POSIX
не так
широко
распространены
(особенно в
старых
системах),
по
сравнению
с
семафорами
System V.
Пример
использования
функций
семафоров POSIX
показан в
sem_wait(3).
sem_close(3),
sem_destroy(3),
sem_getvalue(3),
sem_init(3),
sem_open(3),
sem_post(3),
sem_unlink(3),
sem_wait(3),
pthreads(7),
shm_overview(7)
Русский
перевод
этой
страницы
руководства
был сделан
Alexander Golubev <
[email protected]>, Azamat Hackimov
<
[email protected]>, Hotellook, Nikita
<
[email protected]>, Spiros Georgaras <
[email protected]>, Vladislav
<
[email protected]>, Yuri Kozlov <
[email protected]>
и Иван
Павлов <
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]