UNIX: взаимодействие процессов
Шрифт:
8-16 Функция ftok преобразует полное имя файла в ключ System V IPC. После этого вспомогательный файл удаляется вызовом unlink (именно в этом месте кода, на тот случай, если одна из последующих функций
Функция sem_post
В листинге 10.41 приведен текст функции sem_post, которая увеличивает значение семафора.
11-16 Мы вызываем semop с операцией, увеличивающей значение семафора на 1.
Функция sem_wait
Следующая функция приведена в листинге 10.42; она называется sem_wait и ожидает изменения значения семафора с нулевого на ненулевое, после чего уменьшает значение семафора на 1.
11-16 Мы вызываем semop с операцией, уменьшающей значение семафора на 1.
Функция sem_trywait
В листинге 10.43 приведен текст нашей функции sem_trywait, которая представляет собой неблокируемую версию sem_wait.
13 Единственное отличие от функции sem_wait из листинга 10.42 заключается в том, что флагу sem_flg присваивается
значение IPC_NOWAIT. Если операция не может быть завершена без блокирования вызвавшего потока, функция semop возвращает ошибку EAGAIN, а это именно тот код, который должен быть возвращен sem_trywait, если операция не может быть завершена без блокирования потока.Функция sem_getvalue
Последняя функция приведена в листинге 10.44. Это функция sem_getvalue, возвращающая текущее значение семафора.
11-14 Текущее значение семафора получается отправкой команды GETVAL функции semctl.
10.17. Резюме
Семафоры Posix представляют собой семафоры-счетчики, для которых определены три основные операции:
1. Создание семафора.
2. Ожидание изменения значения семафора на ненулевое и последующее уменьшение значения.
3. Увеличение значения семафора на 1 и возобновление выполнения всех процессов, ожидающих его изменения.
Семафоры Posix могут быть именованными или неименованными (размещаемыми в памяти). Именованные семафоры всегда могут использоваться отдельными процессами, тогда как размещаемые в памяти должны для этого изначально планироваться как разделяемые между процессами. Эти типы семафоров также отличаются друг от друга по живучести: именованные семафоры обладают по меньшей мере живучестью ядра, тогда как размещаемые в памяти обладают живучестью процесса.