ВУЗ:
Составители:
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
- …
- следующая ›
- последняя »