Операционные системы. Замятин А.В - 91 стр.

UptoLike

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

91
Таким образом, флаг создания семафора можно указать так:
int flag = S_IRUSR | S_IWUSR | S_IRGRP | IPC_CREAT;
Системный вызов semctl имеет формат
int semctl (int semid, int sem_num, int command, union semun arg)
где semid это идентификатор набора семафоров; sem_num номер се-
мафора в группе; command код операции; arg указатель на структу-
ру, содержимое которой интерпретируется по-разному, в зависимости
от операции.
Объединение имеет вид
union semun
{
int val; /* устанавливает значение семафора только для SETVAL */
struct semid_ds *buf;
/* используется командами IPC_STAT и IPC_SET */
unsigned short *array; /* используется командами SETALL и GETALL */
};
Объединение semun всегда должен быть переопределен в глобальной
секции программы. Структура semid_ds выглядит следующим образом:
struct semid_ds {
struct ipc_perm sem_perm; /* разрешения на операции */
struct sem *sem_base; /* указатель на массив семафоров в наборе */
ushort sem_nsems; /* количество семафоров */
time_t sem_otime; /* время последнего вызова semop() */
time_t sem_ctime; /* время создания последнего IPC_SET */
};
Вызов semctl позволяет:
уничтожить набор семафоров или индивидуальный семафор в
указанной группе (IPCRMID);
вернуть значение отдельного семафора (GETVAL) или всех се-
мафоров (GETALL);
установить значение отдельного семафора (SETVAL) или всех
семафоров (SETALL);
вернуть число семафоров в наборе семафоров (GETPID).