Provided by: manpages-es_1.55-10_all bug

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)