mark.zlatoust.ru Послать письмо Webmaster-у Web-Master © Бернадинер Марк 

Златоуст.Ru

 

 

SEMOP(2)                                               SEMOP(2)

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

СИНТАКСИС 
        #include 
        #include 
        #include 
        
        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 отрицательно, то  выполняется
	     одно из следующих действий {Требуется право на из-
	     менение.}:

	     1.1. Если значение семафора semval [см.  intro(2)]
		  больше или равно абсолютной величине  sem_op,
		  то абсолютная величина sem_op  вычитается  из
		  значения semval. Аналогично,  если  выражение
		  (sem_flg & SEM_UNDO) истинно,  то  абсолютная
		  величина sem_op добавляется к значению  пере-
		  менной semadj вызывающего процесса для задан-
		  ного семафора [см. exit(2)].

	     1.2. Если значение семафора semval меньше абсолют-
		  ной величины sem_op и  выражение  (sem_flg  &
		  IPC_NOWAIT) истинно, то сразу же возвращается
		  управление вызывающему процессу.

	     1.3. Если значение семафора 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 равно нулю, выполняется  одно
	     из следующих действий {Требуется право на чтение}:

	     3.1. Если значение семафора semval равно нулю,  то
		  управление сразу же возвращается  вызывающему
		  процессу.

	     3.2. Если значение семафора не равно нулю и  выра-
		  жение (sem_flg & IPC_NOWAIT) истинно,  управ-
		  ление сразу же возвращается вызывающему  про-
		  цессу.

	     3.3. Если значение семафора не равно нулю и  выра-
		  жение (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 должен быть  массивом
	структур, а не указателем на массив.



 

 

Бернадинер Марк Абрамович

Мое резюме

Компьютерная страничка

Ресурсы сети

Фотоальбом

 

 

 

mark.zlatoust.ru Послать письмо Webmaster-у Web-Master © Бернадинер Марк