Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
VPS/VDS серверы. 30 локаций на выбор

Серверы VPS/VDS с большим диском

Хорошие условия для реселлеров

4VPS.SU - VPS в 17-ти странах

2Gbit/s безлимит

Современное железо!

Бесплатный конструктор сайтов и Landing Page

Хостинг с DDoS защитой от 2.5$ + Бесплатный SSL и Домен

SSD VPS в Нидерландах под различные задачи от 2.6$

✅ Дешевый VPS-хостинг на AMD EPYC: 1vCore, 3GB DDR4, 15GB NVMe всего за €3,50!

🔥 Anti-DDoS защита 12 Тбит/с!

SEMOP(2)

НАЗВАНИЕ
semop - операции над множеством семафоров

СИНТАКСИС


        #include <sys/types.h>

        #include <sys/ipc.h>

        #include <sys/sem.h>

        

        int semop (semid, sops, nsops);

        int semid;

        struct sembuf **sops;

        unsigned nsops;

ОПИСАНИЕ
Системный вызов semop используется для выполнения набора операций над множеством семафоров, ассоциированным с идентификатором semid. Значение аргумента sops является указателем на массив структур, описывающих операции (см. СЮРПРИЗЫ). Значение аргумента nsops равно количеству структур в массиве. Каждая структура, описывающая операцию, содержит следующие поля:


             short sem_num; /* Номер семафора */

             short sem_op;  /* Операция над семафором */

             short sem_flg; /* Флаги операции */

Каждая операция, специфицированная значением sem_op, выполняется над соответствующим семафором, заданным значениями semid и sem_num.

Значение поля sem_op специфицирует одну из трех операций:

  1. Если значение sem_op отрицательно, то выполняется одно из следующих действий {Требуется право на изменение.}:
    • Если значение семафора semval [см. intro(2)] больше или равно абсолютной величине sem_op, то абсолютная величина sem_op вычитается из значения semval. Аналогично, если выражение (sem_flg & SEM_UNDO) истинно, то абсолютная величина sem_op добавляется к значению переменной semadj вызывающего процесса для заданного семафора [см. exit(2)].
    • Если значение семафора semval меньше абсолютной величины sem_op и выражение (sem_flg & IPC_NOWAIT) истинно, то сразу же возвращается управление вызывающему процессу.
    • Если значение семафора semval меньше абсолютной величины sem_op и выражение (sem_flg & IPC_NOWAIT) ложно, то увеличивается значение semncnt соответствующего семафора и приостанавливается выполнение вызывающего процесса до появления одного из следующих событий:

      Значение semval становится большим или равным абсолютной величине sem_op. Когда это происходит, то соответствующее заданному семафору значение semncnt уменьшается на 1, абсолютная величина sem_op вычитается из значения semval и, если выражение (sem_flg & IPC_UNDO) истинно, абсолютная величина sem_op добавляется к значению semadj вызывающего процесса для заданного семафора.

      Идентификатор множества семафоров, над которым вызывающий процесс выполняет операцию, удаляется из системы [см. semctl(2)]. Когда это происходит, переменной errno присваивается значение EIDRM и вызывающему процессу возвращается -1.

      Вызывающий процесс получает сигнал, который должен быть обработан. Когда это происходит, значение semncnt, соответствующее заданному семафору, уменьшается на 1 и вызывающий процесс возобновляет выполнение так, как описано в signal(2).

  2. Если значение sem_op положительно, то оно добавляется к значению semval и, если выражение (sem_flg & SEM_UNDO) истинно, значение sem_op вычитается из значения semadj вызывающего процесса для заданного семафора. {Требуется право на изменение.}
  3. Если значение sem_op равно нулю, выполняется одно из следующих действий {Требуется право на чтение}:
    • Если значение семафора semval равно нулю, то управление сразу же возвращается вызывающему процессу.
    • Если значение семафора не равно нулю и выражение (sem_flg & IPC_NOWAIT) истинно, управление сразу же возвращается вызывающему процессу.
    • Если значение семафора не равно нулю и выражение (sem_flg & IPC_NOWAIT) ложно, то значение semzcnt для соответствующего семафора увеличивается на 1 и выполнение вызывающего процесса приостанавливается до появления одного из следующих событий:

      Значение semval становится равным нулю. Когда это происходит, то соответствующее заданному семафору значение semzcnt уменьшается на 1.

      Идентификатор множества семафоров, над которым вызывающий процесс выполняет операцию, удаляется из системы. Когда это происходит, переменной errno присваивается значение EIDRM и вызывающему процессу возвращается -1.

      Вызывающий процесс получает сигнал, который должен быть обработан. Когда это происходит, значение semzcnt, соответствующее заданному семафору, уменьшается на 1 и вызывающий процесс возобновляет выполнение так, как описано в signal(2).

Системный вызов semop завершается неудачей, если по крайней мере для одной операции из набора выполнено хотя бы одно из следующих условий:

[EINVAL]
Значение аргумента semid не является корректным идентификатором множества семафоров.
[EFBIG]
Номер семафора sem_num меньше нуля или больше или равен количеству семафоров в множестве, определяемом идентификатором semid.
[E2BIG]
Количество заданных операций nsops больше максимально допустимого в системе.
[EACCES]
У вызывающего процесса нет прав на выполнение операции [см. intro(2)].
[EAGAIN]
Выполнение операции привело бы к приостановке вызывающего процесса, а выражение (semflg & IPC_NOWAIT) истинно.
[ENOSPC]
Превышается максимально допустимое количество процессов, устанавливающих флаг SEM_UNDO.
[EINVAL]
Превышается максимально допустимое количество семафоров, для которых вызывающий процесс устанавливает флаг SEM_UNDO.
[ERANGE]
Значение семафора semval превышает максимально допустимое системой.
[ERANGE]
Значение semadj превышает максимально допустимое системой.
[EFAULT]
Аргумент sops указывает за пределы отведенного процессу адресного пространства.

При успешном выполнении системного вызова значение sempid для каждого семафора, заданного массивом структур, на который указывает sops, устанавливается равным идентификатору (номеру) вызывающего процесса.

СМ. ТАКЖЕ
exec(2), exit(2), fork(2), intro(2), semctl(2), semget(2).

ДИАГНОСТИКА
Если системный вызов semop завершается неудачей из-за получения сигнала, то вызывающему процессу возвращается -1, а переменной errno присваивается значение EINTR. Если системный вызов semop завершается неудачей из-за удаления из системы идентификатора множества семафоров semid , то возвращается -1 и errno присваивается значение EIDRM.

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

СЮРПРИЗЫ
В данной реализации аргумент sops должен быть массивом структур, а не указателем на массив.

VPS в России, Европе и США

Бесплатная поддержка и администрирование

Оплата российскими и международными картами

🔥 VPS до 5.7 ГГц под любые задачи с AntiDDoS в 7 локациях

💸 Гифткод CITFORUM (250р на баланс) и попробуйте уже сейчас!

🛒 Скидка 15% на первый платеж (в течение 24ч)

Скидка до 20% на услуги дата-центра. Аренда серверной стойки. Colocation от 1U!

Миграция в облако #SotelCloud. Виртуальный сервер в облаке. Выбрать конфигурацию на сайте!

Виртуальная АТС для вашего бизнеса. Приветственные бонусы для новых клиентов!

Виртуальные VPS серверы в РФ и ЕС

Dedicated серверы в РФ и ЕС

По промокоду CITFORUM скидка 30% на заказ VPS\VDS

Новости мира IT:

Архив новостей

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 7861149
Пресс-релизы — pr@citforum.ru
Обратная связь
Информация для авторов
Rambler's Top100 TopList This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2019 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...