//lock/lockpxsem.c
1 #include "unpipc.h"
2 #define LOCK_PATH "pxsemlock"
3 sem_t *locksem;
4 int initflag;
5 void
6 my_lock(int fd)
7 {
8 if (initflag == 0) {
9 locksem = Sem_open(Px_ipc_name(LOCK_PATH), O_CREAT, FILE_MODE, 1);
10 initflag = 1;
11 }
12 Sem_wait(locksem);
13 }
14 void
15 my_unlock(int fd)
16 {
17 Sem_post(locksem);
18 }
Один из семафоров используется для рекомендательной блокировки доступа к файлу и инициализируется единицей при первом вызове функции. Для получения блокировки мы вызываем sem_wait, а для ее снятия — sem_post.
10.8. Функции sem_init и sem_destroy
До сих пор мы имели дело только с именованными семафорами Posix. Как мы уже говорили, они идентифицируются аргументом
#include
int sem_init(sem_t
/* Возвращает –1 в случае ошибки */
int sem_destroy(sem_t
/* Возвращает 0 в случае успешного завершения, –1 – в случае ошибки */
Размещаемый в памяти семафор инициализируется вызовом sem_init. Аргумент
После завершения работы с размещаемым в памяти семафором его можно уничтожить, вызвав sem_destroy.
ПРИМЕЧАНИЕ 1
Функции sem_open не требуется параметр, аналогичный
ПРИМЕЧАНИЕ 2
Обратите внимание, что для размещаемого в памяти семафора нет ничего аналогичного флагу O_CREAT: функция sem_init всегда инициализирует значение семафора. Следовательно, нужно быть внимательным, чтобы вызывать sem_init только один раз для каждого семафора. (Упражнение 10.2 иллюстрирует разницу в этом смысле между именованным и размещаемым в памяти семафорами.) При вызове sem_init для уже инициализированного семафора результат непредсказуем.
ПРИМЕЧАНИЕ 3
Удостоверьтесь, что вы понимаете фундаментальную разницу между sem_open и sem_init. Первая возвращает указатель на переменную типа sem_t, причем выделение места под переменную и ее инициализация выполняются этой же функцией. Напротив, первый аргумент sem_init представляет собой указатель на переменную типа sem_t, место под которую должен был заранее выделить вызывающий. Функция sem_init только инициализирует эту переменную.