Лекции по курсу "Системное программирование для UNIX". Литвинов Д.Г. - 66 стр.

UptoLike

Составители: 

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