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

UptoLike

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

69
аргумента buf в объединении semun;
IPC_SET Устанавливает значение элемента ipc_perm структуры semid_ds для
множества;
IPC_RMID Удаляет множество из ядра;
GETALL Используется для получения значений всех семафоров множества.
Целые значения запоминаются в массиве элементов unsigned short, на
который указывает член объединения array;
GETNCNT Выдает число процессов, ожидающих ресурсов в данный момент;
GETPID Возвращает PID процесса, выполнившего последний вызов semop;
GETVAL Возвращает значение одного семафора из множества;
GETZCNT Возвращает число процессов, ожидающих стопроцентного
освобождения ресурса;
SETALL Устанавливает значения семафоров множества, взятые из элемента
array объединения;
SETVAL Устанавливает значение конкретного семафора множества как элемент
val объединения.
Аргумент arg вызова semсtl() является примером объединения semun,
описанного в linux/sem.h следующим образом:
/* аргумент arg для системного вызова semctl */
union semun {
int val; /* значение для SETVAL-а */
struct semid_ds *buf; /* буфер для IPC_STAT и IPC_SET */
ushort *array; /* массив для GETALL и SETALL */
struct seminfo *__buf; /* буфер для IPC_INFO */
void *__pad;
};
Значения полей следующие:
val Определяет значение, в которое устанавливается семафор командой
SETVAL;
buf Используется командами IPC_STAT/IPC_SET. Представляет копию
внутренней структуры данных семафора, находящейся в ядре;
array Указатель для команд GETALL/SETALL. Ссылается на массив целых,
используемый для установки или получения всех значений семафоров
в множестве;
__buf, __pad Предназначены для ядра и почти, а то и вовсе не нужны разработчику
приложения. Эти два аргумента специфичны для LINUX, их нет в
других системах UNIX.
Поскольку этот особенный системный вызов наиболее сложен для восприятия
среди всех системных вызовов System V IPC, мы рассмотрим несколько его примеров в
действии.
Следующий отрывок выдает значение указанного семафора. Последний
аргумент (объединение) игнорируется, если используется команда GETVAL.
int get_sem_val( int sid, int semnum )
{
return( semctl(sid, semnum, GETVAL, 0));
}
Программа (semtool), приведенная в следующем примере, может
использоваться для интерактивной работы с семафорами. Поведение semtool()-а зависит
от аргументов командной строки, что удобно для вызова из скрипта shell-а. Позволяет
выполнять операции от создания и манипулирования до редактирования прав доступа и
удаления множества семафоров. Может быть использовано для управления
                 аргумента buf в объединении semun;
IPC_SET          Устанавливает значение элемента ipc_perm структуры semid_ds для
                 множества;
IPC_RMID         Удаляет множество из ядра;
GETALL           Используется для получения значений всех семафоров множества.
                 Целые значения запоминаются в массиве элементов unsigned short, на
                 который указывает член объединения array;
GETNCNT          Выдает число процессов, ожидающих ресурсов в данный момент;
GETPID           Возвращает PID процесса, выполнившего последний вызов semop;
GETVAL           Возвращает значение одного семафора из множества;
GETZCNT          Возвращает     число    процессов,   ожидающих    стопроцентного
                 освобождения ресурса;
SETALL           Устанавливает значения семафоров множества, взятые из элемента
                 array объединения;
SETVAL           Устанавливает значение конкретного семафора множества как элемент
                 val объединения.
       Аргумент arg вызова semсtl() является примером объединения semun,
описанного в linux/sem.h следующим образом:
       /* аргумент arg для системного вызова semctl */
       union semun {
          int val;                /* значение для SETVAL-а */
          struct semid_ds *buf;   /* буфер для IPC_STAT и IPC_SET */
          ushort *array;          /* массив для GETALL и SETALL */
          struct seminfo *__buf; /* буфер для IPC_INFO */
          void *__pad;
       };
        Значения полей следующие:
val             Определяет значение, в которое устанавливается семафор командой
                SETVAL;
buf             Используется командами IPC_STAT/IPC_SET. Представляет копию
                внутренней структуры данных семафора, находящейся в ядре;
array           Указатель для команд GETALL/SETALL. Ссылается на массив целых,
                используемый для установки или получения всех значений семафоров
                в множестве;
__buf, __pad    Предназначены для ядра и почти, а то и вовсе не нужны разработчику
                приложения. Эти два аргумента специфичны для LINUX, их нет в
                других системах UNIX.
        Поскольку этот особенный системный вызов наиболее сложен для восприятия
среди всех системных вызовов System V IPC, мы рассмотрим несколько его примеров в
действии.
        Следующий отрывок выдает значение указанного семафора. Последний
аргумент (объединение) игнорируется, если используется команда GETVAL.
       int get_sem_val( int sid, int semnum )
       {
          return( semctl(sid, semnum, GETVAL, 0));
       }
        Программа (semtool), приведенная в следующем примере, может
использоваться для интерактивной работы с семафорами. Поведение semtool()-а зависит
от аргументов командной строки, что удобно для вызова из скрипта shell-а. Позволяет
выполнять операции от создания и манипулирования до редактирования прав доступа и
удаления множества семафоров. Может быть использовано для управления



                                                                                69