ВУЗ:
Составители:
66
Так например, семафоры удобны при синхронизации доступа к единому
ресурсу, такому как принтер. Если же нам нужна синхронизация доступа к ресурсу,
имеющему внутреннюю структуру, такому как файл с базой данных, удобнее
оказываются другие методы.
Рассмотрим внутренние структуры данных Linux, с которыми имеют дело
семафоры.
/* Структура данных semid для каждого множества семафоров системы */
struct semid_ds {
struct ipc_perm sem_perm;
time_t sem_otime;
time_t sem_ctime;
struct sem *sem_base;
struct wait_queue *eventn;
struct wait_queue *eventz;
struct sem_undo *undo;
ushort sem_nsems;
};
Операции с этой структурой проводятся с помощью системных вызовов. Поля
структуры означают следующее:
sem_perm Это пример структуры ipc_perm, которая описана в linux/ipc.h. Она
содержит информацию о доступе к множеству семафоров, включая
права доступа и информацию о создателе множества (uid и т.д.);
sem_otime Время последней операции semop(). Описывается чуть позже;
sem_ctime Время последнего изменения структуры;
sem_base Указатель на первый семафор в массиве;
sem_undo Число запросов undo в массиве (описывается ниже);
sem_nsems Количество семафоров в массиве.
В semid_ds есть указатель на базу массива семафоров. Каждый элемент массива
имеет тип sem, который описан в linux/sem.h:
/* Структура для каждого семафора в системе */
struct sem {
short sempid;
ushort semval;
ushort semncnt;
ushort semzcnt;
};
sem_pid ID процесса, проделавшего последнюю операцию;
sem_semval Текущее значение семафора;
sem_semncnt Число процессов, ожидающих освобождения требуемых ресурсов;
sem_semzcnt Число процессов, ожидающих освобождения всех ресурсов.
Функция semget() используется для того, чтобы создать новое множество
семафоров или получить доступ к старому.
int semget ( key_t key, int nsems, int semflg )
В случае успешного выполнения функция возвращает идентификатор
множества семафоров, -1 - в случае ошибки. Переменная errno может принимать
следующие значения:
EACCESS доступ отклонен;
EEXIST идентификатор уже существует, создание нового невозможно;
EIDRM множество помечено как удаляемое;
ENOENT множество не существует, ни разу не была исполнена команда
IPC_CREAT;
ENOMEM не хватает памяти для новых семафоров;
ENOSPC превышен лимит на количество множеств семафоров.
Так например, семафоры удобны при синхронизации доступа к единому
ресурсу, такому как принтер. Если же нам нужна синхронизация доступа к ресурсу,
имеющему внутреннюю структуру, такому как файл с базой данных, удобнее
оказываются другие методы.
Рассмотрим внутренние структуры данных Linux, с которыми имеют дело
семафоры.
/* Структура данных semid для каждого множества семафоров системы */
struct semid_ds {
struct ipc_perm sem_perm;
time_t sem_otime;
time_t sem_ctime;
struct sem *sem_base;
struct wait_queue *eventn;
struct wait_queue *eventz;
struct sem_undo *undo;
ushort sem_nsems;
};
Операции с этой структурой проводятся с помощью системных вызовов. Поля
структуры означают следующее:
sem_perm Это пример структуры ipc_perm, которая описана в linux/ipc.h. Она
содержит информацию о доступе к множеству семафоров, включая
права доступа и информацию о создателе множества (uid и т.д.);
sem_otime Время последней операции semop(). Описывается чуть позже;
sem_ctime Время последнего изменения структуры;
sem_base Указатель на первый семафор в массиве;
sem_undo Число запросов undo в массиве (описывается ниже);
sem_nsems Количество семафоров в массиве.
В semid_ds есть указатель на базу массива семафоров. Каждый элемент массива
имеет тип sem, который описан в linux/sem.h:
/* Структура для каждого семафора в системе */
struct sem {
short sempid;
ushort semval;
ushort semncnt;
ushort semzcnt;
};
sem_pid ID процесса, проделавшего последнюю операцию;
sem_semval Текущее значение семафора;
sem_semncnt Число процессов, ожидающих освобождения требуемых ресурсов;
sem_semzcnt Число процессов, ожидающих освобождения всех ресурсов.
Функция semget() используется для того, чтобы создать новое множество
семафоров или получить доступ к старому.
int semget ( key_t key, int nsems, int semflg )
В случае успешного выполнения функция возвращает идентификатор
множества семафоров, -1 - в случае ошибки. Переменная errno может принимать
следующие значения:
EACCESS доступ отклонен;
EEXIST идентификатор уже существует, создание нового невозможно;
EIDRM множество помечено как удаляемое;
ENOENT множество не существует, ни разу не была исполнена команда
IPC_CREAT;
ENOMEM не хватает памяти для новых семафоров;
ENOSPC превышен лимит на количество множеств семафоров.
66
Страницы
- « первая
- ‹ предыдущая
- …
- 64
- 65
- 66
- 67
- 68
- …
- следующая ›
- последняя »
