Прототип системного вызова
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semop(int semid, struct sembuf *sops, int nsops);
Описание системного вызова
Системный вызов semop предназначен для выполнения операций A, D и Z над семафорами из массива IPC семафоров. Данное описание не является полным описанием системного вызова, а ограничивается рамками текущего курса. Для полного описания обращайтесь к UNIX man.
Параметр semid является дескриптором System V IPC для набора семафоров, т.е. значением, которое вернул системный вызов semget() при создании набора семафоров или при его поиске по ключу.
Каждый из nsops элементов массива, на который указывает параметр sops, определяет операцию, которая должна быть совершена над каким-либо семафоров из массива IPC семафоров и имеет тип структуры struct sembuf, в которую входят следующие переменные:
short sem_num - номер семафора в массиве IPC семафоров (нумеруются, начиная с 0); short sem_op - выполняемая операция; short sem_flg - флаги для выполнения операции. В нашем курсе всегда будем полагать равной 0.
Значение элемента структуры sem_op определяется следующим образом:
Для выполнения операции A(S,n) значение должно быть равно n.
Для выполнения операции D(S,n) значение должно быть равно -n.
Для выполнения операции Z(S) значение должно быть равно 0.
Семантика системного вызова подразумевает, что все операции будут в реальности выполнены над семафорами только перед успешным возвращением из системного вызова. Если при выполнении операций D или Z процесс перешел в состояние ожидания, то он может быть выведен из этого состояния и при возникновении следующих форсмажорных ситуаций:
- Массив семафоров был удален из системы. В этом случае происходит возврат из системного вызова с констатацией ошибочной ситуации.
- Процесс получил сигнал, который должен быть обработан.
Возвращаемое значение
Системный вызов возвращает значение 0 при нормальном завершении и значение -1 при возникновении ошибки.