русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Семафоры


Дата добавления: 2014-11-28; просмотров: 687; Нарушение авторских прав


SEMCTL

semctl - производит операции управления семафорами

 

СИНТАКСИС

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

int semctl(int semid, int semnum, int cmd, ...);

 

ОПИСАНИЕ

Функция semctl позволяет выполнять операции, определенные в cmd над набором семафоров, указанным в semid или над семафором с номером semnum из этого набора. (Семафоры нумеруются начиная с 0.)

Функция имеет три или четыре аргумента. Если аргументов четыре, то вызов выглядит как semctl(semid,semnum,cmd,arg); где четвертый аргумент arg имеет тип union semun, определенный как

 

#if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED)

/* union semun is defined by including <sys/sem.h> */

#else

/* according to X/OPEN we have to define it ourselves */

union semun

{

int val; /* value for SETVAL */

struct semid_ds *buf; /* buffer for IPC_STAT, IPC_SET */

unsigned short *array; /* array for GETALL, SETALL */

/* Linux specific part: */

struct seminfo *__buf; /* buffer for IPC_INFO */

};

#endif

 

Аргумент cmd может принимать следующие значения:

 

IPC_STAT - Скопируйте информацию из структуры данных набора семафоров в структуру, указанную в arg.buf. Аргумент semnum игнорируется. Вызывающий процесс должен прочитать привилегии доступа в наборе семафоров.

IPC_SET - Внесите значения некоторых членов структуры semid_ds, на которую указывает arg.buf , в структуру данных набора семафоров и обновите sem_ctime. Присвоить следующим полям структуры данных struct semid_ds соответствующие значения, на которые указывает arg.buf

 

sem_perm.uid

sem_perm.gid

sem_perm.mode /* Только младшие 9 битов */

 

Эта команда может выполняться только процессом, который имеет действующий идентификатор пользователя, равный либо идентификатору суперпользователя, либо создателя или владельца набора семафоров. Аргумент semnum игнорируется.



IPC_RMID - Немедленно удалить из системы набор семафоров и структуры его данных, запускающие все процессы, находящиеся в режиме ожидания (при этом возвращается сообщение об ошибке, а errno присваивается значение EIDRM). Эта команда может выполняться только процессом, который имеет действующий идентификатор пользователя, равный либо идентификатору суперпользователя, либо создателя или владельца набора семафоров. Аргумент semnum игнорируется.

GETALL - Возвращает значение semval всем семафорам в массиве arg.array. Аргумент semnum игнорируется. Для этого вызывающему процессу нужны права на чтение.

GETNCNT - Системный вызов возвращает значение semncnt семафору semnum-th (например, число процессов, ожидающих увеличения значения semval семафора semnum-th). Для этого вызывающему процессу нужны права на чтение.

GETPID - Системный вызов возвращает значение sempid семафору semnum-th (например, идентификатор процесса, который последним делал вызов semop семафору semnum-th). Для этого вызывающему процессу нужны права на чтение.

GETVAL - системный вызов возвращает значение semval семафору semnum-th. Для этого вызывающему процессу нужны права на чтение.

GETZCNT - Системный вызов возвращает значение semzcnt семафору semnum-th (например, количество процессов, ожидающих, чтобы значение semval семафора semnum-th стало равным нулю). Для этого вызывающему процессу нужны права на чтение.

SETALL - Установить значение semval всех семафоров равным значениям элементов массива, на который указывает arg.array, изменяя также sem_ctime, являющееся членом структуры semid_ds ; а эта структура ассоциируется с набором семафоров. История отменяемых операций удаляется для всех измененных семафоров во всех процессах. Процессы, находящиеся в очереди, активизируются, если semval становится равным нулю или значение его увеличивается. Аргумент semnum игнорируется. Для этого вызывающему процессу нужны права на чтение.

SETVAL - Установите значение semval на указанное в arg.val для всех семафоров semnum-th, изменяя также sem_ctime в структуре semid_ds, соотносимой с набором семафоров. История отмененных операций удаляется для всех измененных семафоров во всех процессах. Процессы, находящиеся в очереди, активизируются, если semval становится равным нулю или значение его увеличивается. Вызывающему процессу потребуется право на его изменение.

 

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При ошибке semctl вернет -1, а переменной errno присваивается номер ошибки. Иначе говоря, системный вызов возвращает положительное значение, зависящее от cmd:

 

GETNCNT - значение семафора равно semncnt.

GETPID - значение семафора равно sempid.

GETVAL - значение семафора равно semval.

GETZCNT - значение семафора равно semzcnt.

 

SEMGET

semget - считывает идентификатор набора семафоров

 

СИНТАКСИС

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

int semget(key_t key, int nsems, int semflg);

 

ОПИСАНИЕ

Системный вызов возвращает идентификатор набора семафоров, связанный с аргументом key. Создается новый набор из семафоров nsems , если значение key равно IPC_PRIVATE или c ключом key не связано ни одного существующего набора семафора, а выражение semflg & IPC_CREAT истинно.

Наличие в semflg полей IPC_CREAT и IPC_EXCL играет ту же роль, что и наличие O_CREAT и O_EXCL в аргументе, заданном для режима системного вызова open(). Например, фукция semget не выполняется, если semflg имеет флаги IPC_CREAT и IPC_EXCL, а набор семафоров уже существует для key.

Младшие 9 битов аргумента semflg определяют права доступа (для владельца, группы и остальных) к набору семафоров.Эти биты имеют тот же формат и те же значения, что и аргумент mode в функциях open() или creat() (хотя права на запуск для семафоров не имеют значения, а права на запись приравниваются к правам на изменение значений семафора).

При создании нового набора семафоров semget инициализирует связанную с семафором структуру данных semid_ds следующим образом:

  • sem_perm.cuid и sem_perm.uid присваиваются значения идентификаторов эффективного пользователя вызывающего процесса.
  • sem_perm.cgid и sem_perm.gid присваиваются значения идентификаторов эффективной группы пользователей вызывающего процесса.
  • Младшим 9 битам sem_perm.mode присваивается значение младших 9 битам semflg.
  • sem_nsems присваивается значение nsems.
  • sem_otime присваивается значение 0.
  • sem_ctime устанавливается на текущее время.

 

Аргумент nsems может быть равен 0, если набор семафоров не создается. Иначе аргумент nsems должен быть больше, чем 0 и меньше, либо равен максимальному количеству семафоров в наборе (SEMMSL).

Если набор семафоров уже существует, то проверяются права доступа.

 

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При удачном завершении возвращаемое значение будет представлять собой идентификатор набора семафоров (целое неотрицательное значение), иначе возвращается -1, а переменной errno присваивается номер ошибки.

 

SEMOP

semop - операции над семафорами

 

СИНТАКСИС

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

int semop(int semid, struct sembuf *sops, unsigned nsops);

 

ОПИСАНИЕ

Функция производит операции над выбранными элементами из набора семафоров semid. Каждый из элементов nsops в массиве sops определяет операцию, производимую над семафором в структуре struct sembuf, состоящей из полей:

 

short sem_num;/* semaphore number: 0 = first */

short sem_op;/* semaphore operation */

short sem_flg;/* operation flags */

 

Флаги в sem_flg могут иметь значения IPC_NOWAIT и SEM_UNDO. Если стоит флаг SEM_UNDO, то будет выполнена обратная операция при закрытии процесса.

Обратная операция будет выполнена только при условии выполнения предыдущей операции. Каждая операция выполняется над семафором sem_num набора, где первый семафор набора имеет номер 0, и его значение равно одному из трех следующих:

 

  1. Если sem_op является положительным целым числом, то оно добавляется к semval. Если для операции стоит флаг SEM_UNDO, то система изменяет счетчик обратных операций для этого семафора. Операция все время производится и поэтому никогда не может перейти в режим ожидания. Вызывающий процесс должен иметь права на изменение набора.
  2. Если sem_op равен нулю, то процесс должен иметь права на чтение набора. Если semval равен нулю, то операция производится без наличия дополнительных прав. Иначе, если флаг IPC_NOWAIT стоит в поле семафора sem_flg, системный вызов не выполняется (производятся все обратные операции), а errno присваивается значение EAGAIN. В другом случае semzcnt увеличивается на единицу, а процесс переходит в режим ожидания до того момента, когда
    • semval становится равным 0, а значение semzcnt увеличивается.
    • Набор семафоров удален, системный вызов не выполняется, а errno присваивается значение EIDRM.
    • Вызывающий процесс получает сигнал, который должен быть обработан; когда это происходит, значение semzcnt увеличивается, а системный вызов не выполняется, а переменной errno присваивается значение EINTR.
  3. Если sem_op меньше нуля, то процесс должен иметь права на изменение набора. Если semval больше или равен абсолютному значению sem_op, то абсолютное значение sem_op приравнивается к semval. Если для этой операции установлен флаг SEM_UNDO, то счетчик обратных операций для этого семафора обновляется, а выполнение операции продолжается. Иначе, если флаг IPC_NOWAIT стоит в поле sem_flg, системный вызов не выполняется (производятся все обратные операции), а errno присваивается значение EAGAIN. В ином случае semncnt увеличивается на единицу, а процесс переходит в режим ожидания до того момента, когда

· semval становится больше или равно абсолютному значению sem_op, значение semncnt уменьшается, абсолютное значение sem_op приравнивается к semval, и если флаг SEM_UNDO установлен для этой операции, то система обновляет счетчик обратных операций для этого семафора.

· При удалении набора семафоров системный вызов не выполняется, а переменной errno присваивается значение EIDRM. Вызывающий процесс получает сигнал, после чего semncnt увеличивается, системный вызов не выполняется, а переменной errno присваивается значение EINTR.

· В случае выполнения sempid, являющейся членом структуры, sem приобретает значение идентификатора процесса. Так или иначе, sem_otime и sem_ctime устанавливаются на текущее время.

 

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном выполнении системного вызова возвращаемое значение равно нулю, в случае ошибки оно равно -1, а переменной errno присваивается номер ошибки.

 



<== предыдущая лекция | следующая лекция ==>
Очереди сообщений | Разделяемая память


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.009 сек.