Provided by:
manpages-es_1.55-10_all 
NOMBRE
semop - operaciones con semaforos
SINTAXIS
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semop(int semid, struct sembuf *sops, unsigned nsops);
DESCRIPCI'ON
Un semaforo se representa por una estructura anonima que incluye los
siguientes miembros:
unsigned short semval; /* valor del semaforo */
unsigned short semzcnt; /* # esperando por cero */
unsigned short semncnt; /* # esperando por incremento */
pid_t sempid; /* proceso que hizo la ultima operacion */
La funcion semop realiza operaciones sobre los miembros seleccionados
del conjunto de semaforos indicado por semid. Cada uno de los nsops
elementos en el array apuntado por sops especifica una operacion a ser
realizada en un semaforo mediante una estructura sembuf que incluye los
siguientes miembros:
unsigned short sem_num; /* numero de semaforo */
short sem_op; /* operacion sobre el semaforo */
short sem_flg; /* banderas o indicadores para la operacion */
Banderas reconocidas en sem_flg son IPC_NOWAIT y SEM_UNDO. Si una
operacion ejecuta SEM_UNDO, sera deshecha cuando el proceso finalice.
El conjunto de operaciones contenido en sops se realiza de forma
at'omica, es decir, las operaciones son llevadas a cabo al mismo tiempo,
y solo si pueden ser realizadas simultaneamente. El comportamiento de
la llamada al sistema en caso de que no todas las operaciones puedan
realizarse inmediatamente depende de la presencia de la bandera
IPC_NOWAIT en los campos sem_flg individuales, como se ve mas abajo.
Cada operacion es ejecutada en el semaforo numero sem_num donde el
primer semaforo del conjunto es el semaforo 0. Hay tres tipos de
operacion, que se distinguen por el valor de sem_op.
Si sem_op es un entero positivo, la operacion anade este valor al valor
del semaforo (semval). Ademas, si SEM_UNDO es invocado para esta
operacion, el sistema actualiza el contador del proceso para
operaciones "undo" (semadj) para este semaforo. La operacion siempre
puede ejecutarse - nunca fuerza a un proceso a esperar. El proceso
invocador debe tener permisos de modificacion sobre el conjunto de
semaforos.
Si sem_op es cero, el proceso debe tener permiso de lectura en el
semaforo. Esta es una operacion "espera-por-cero": si semval es cero,
la operacion puede ejecutarse inmediatamente. Por otra parte, si
IPC_NOWAIT es invocado en sem_flg, la llamada al sistema falla con la
variable errno fijada a EAGAIN . (y ninguna de las operaciones sops se
realiza.) En otro caso semzcnt (el numero de procesos esperando hasta
que el valor del semaforo sea cero) es incremetada en uno y el proceso
duerme hasta que algo de lo siguiente ocurra:
o semval es 0, instante en el que el valor de semzcnt es
decrementeado.
o El semaforo es eliminado: la llamada al sistema falla con errno
fijada a EIDRM.
o El proceso que lo invoca captura una senal: el valor de semzcnt
es decrementado y la llamada al sistema falla con errno fijada a
EINTR.
Si sem_op es menor que cero, el proceso debe tener los permisos de
modificacion sobre el semaforo. Si semval es mayor que o igual que el
valor absoluto de sem_op, la operacion puede ejecutarse inmediatamente:
el valor absoluto de sem_op es restado a semval. y, si SEM_UNDO es
invocado para esta operacion, el sistema actualiza el contador "undo"
del proceso (semadj) para este semaforo. Si el valor absoluto de
sem_op es mayor que semval, y IPC_NOWAIT esta presente en sem_flg, la
llamada al sistema falla con errno fijado a EAGAIN. (y ninguna de las
operaciones sops se realiza.) En otro caso semncnt (el numero de
procesos esperando a que se incremente el valor de este semaforo) es
incrementado en uno y el proceso duerme hasta que ocurra:
o semval sea mayor o igual que el valor absoluto de sem_op, en
cuyo instante el valor de semncnt es decrementado, el valor
absoluto de sem_op es restado de semval y, si SEM_UNDO es
invocado para esta operacion, el sistema actualiza el contador
"undo" del proceso (semadj) para este semaforo.
o El semaforo es es eliminado del sistema: la llamada al sistema
falla con errno fijado a EIDRM.
o El proceso invocador captura una senal: el valor de semncnt es
decrementado y la llamada al sistema falla con errno fijado a
EINTR.
En caso de que haya funcionado, el valor sempid para cada semaforo
especificado en el array apuntado por sops es fijado al identificador del
proceso del proceso invocador. Ademas sem_otime es puesto a la hora actual.
VALOR DEVUELTO
Si todo ha sido correcto la llamada al sistema devuelve 0, en otro caso
devuelve -1 con errno indicando el error.
ERRORES
En caso de error errno tendra uno de los siguientes valores:
E2BIG El argumento nsops es mayor que SEMOPM, el numero maximo de
operaciones permitidas por llamada del sistema.
EACCES El proceso invocador no tiene permisos de acceso al semaforo
como se requiere por una de las operaciones especificadas.
EAGAIN Una operacion no puede ser ejecutada inmediatamente y
IPC_NOWAIT ha sido invocada en su sem_flg.
EFAULT La direccion apuntada por sops no es accesible.
EFBIG Para algunas operaciones el valor de sem_num es menor que 0
o mayor o igual que el numero de semaforos en el conjunto.
EIDRM El conjunto de semaforos ha sido eliminado.
EINTR Mientras estaba bloqueado en esta llamada al sistema, el
proceso capturo una senal.
EINVAL Este conjunto de semaforos no existe, o semid es menor que
cero, o nsops tiene un valor no-positivo.
ENOMEM El sem_flg de alguna operacion invoco SEM_UNDO y el sistema
no tiene suficiente memoria para alojar la estructura
"undo".
ERANGE Para alguna operacion sem_op+semval es mayor que SEMVMX, el
valor maximo dependiente de la implementacion para semval.
OBSERVACIONES
Las estructuras sem_undo de un proceso no son heredadas tras la
ejecucion de fork(2) , pero si tras la ejecucion de execve(2). semop
no es reiniciada nunca automaticamente despues de haber sido
interrumpida por un manejador de senales, sin importar que las banderas
SA_RESTART esten presentes cuando se establezca el manejador senales.
semadj es un entero por cada proceso que representa simplemente el
numero (negativo) de todas las operaciones sobre semaforos realizadas
con la bandera SEM_UNDO. Cuando se establece directamente el valor de
un semaforo usando la solicitud SETVAL o SETALL en semctl(2), los
correspondientes valores de semadj en todos los procesos son borrados.
Los valores semval, sempid, semzcnt, y semnct para un semaforo pueden
ser obtenidos usando llamadas semctl(2) apropiadas.
Los siguientes valores son limites en el conjunto de recursos de los
semaforos q ue afecta a semop
SEMOPM Numero maximo de operaciones permitidas para una llamada (32)
semop.
SEMVMX Valor maximo permitido para semval: dependiente de la
implementacion (32767).
La implementacion no contiene limites intrinsecos para ajustar el valor
maximo de la salida (SEMAEM), el numero maximo de estructuras "undo"
que el sistema permite (SEMMNU) y maximo numero de entradas "undo" por
proceso para los parametros del sistema.
FALLOS
Cuando un proceso termina, su conjunto de estructuras semadj asociado
se utiliza para deshacer el efecto de todas las operaciones sobre
semaforos que realizo con la bandera SEM_UNDO. Esto conlleva una
dificultad: si una (o mas) de estas modificaciones sobre semaforos
resultara en un intento de decrementar el valor de un semaforo por
debajo de cero, cque deberia hacer una implementacion? Una posible
aproximacion seria bloquearse hasta que todas las modificaciones sobre
semaforos puedan ser realizadas. Esto no es deseable sin embargo
puesto que podria bloquear la terminacion del proceso durante largos
periodos arbitrarios. Otra posibilidad seria ignorar tales
modificaciones sobre semaforos por completo (algo analogo a un fallo
cuando se especifica IPC_NOWAIT para una operacion sobre semaforos).
Linux adopta un tercer enfoque: decrementar el valor del semaforo tanto
como sea posible (p.e., hasta cero) y permitir la terminacion del
proceso inmediatamente.
CONFORME A
SVr4, SVID. SVr4 documenta las condiciones de error adicionales
EINVAL, EFBIG, ENOSPC.
V'EASE TAMBI'EN
ipc(5), semctl(2), semget(2), sigaction(2)