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

NOMBRE

       semop - operaciones con semáforos

SINTAXIS

       #include <sys/types.h>
       #include <sys/ipc.h>
       #include <sys/sem.h>

       int semop(int semid, struct sembuf *sops, unsigned nsops);

DESCRIPCIÓN

       Un semáforo se representa por una estructura anónima que incluye los siguientes miembros:

           unsigned short  semval;   /* valor del semáforo */
           unsigned short  semzcnt;  /* # esperando por cero */
           unsigned short  semncnt;  /* # esperando por incremento */
           pid_t           sempid;   /* proceso que hizo la última operación */

       La  función semop realiza operaciones sobre los miembros seleccionados del conjunto de semáforos indicado
       por semid.  Cada uno de los nsops elementos en el array apuntado por sops especifica una operación a  ser
       realizada en un semáforo mediante una estructura sembuf que incluye los siguientes miembros:

           unsigned short sem_num;  /* número de semáforo */
           short sem_op;            /* operación sobre el semáforo */
           short sem_flg;           /* banderas o indicadores para la operación */

       Banderas  reconocidas  en  sem_flg  son  IPC_NOWAIT  y SEM_UNDO.  Si una operación ejecuta SEM_UNDO, sera
       deshecha cuando el proceso finalice.

       El conjunto de operaciones contenido en sops se realiza de forma atómica, es decir, las  operaciones  son
       llevadas  a  cabo al mismo tiempo, y sólo si pueden ser realizadas simultáneamente.  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 más abajo.

       Cada operación es ejecutada en el semáforo numero sem_num donde el primer semáforo  del  conjunto  es  el
       semáforo 0.  Hay tres tipos de operación, que se distinguen por el valor de sem_op.

       Si  sem_op  es un entero positivo, la operación añade este valor al valor del semáforo (semval).  Además,
       si SEM_UNDO es invocado  para  esta  operación,  el  sistema  actualiza  el  contador  del  proceso  para
       operaciones  "undo"  (semadj) para este semáforo.  La operación siempre puede ejecutarse - nunca fuerza a
       un proceso a esperar.  El proceso invocador debe tener permisos de  modificación  sobre  el  conjunto  de
       semáforos.

       Si  sem_op  es  cero,  el  proceso  debe  tener permiso de lectura en el semáforo.  Esta es una operación
       "espera-por-cero": si semval es cero, la operación 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 número  de  procesos  esperando
       hasta  que el valor del semáforo sea cero) es incremetada en uno y el proceso duerme hasta que algo de lo
       siguiente ocurra:

       •      semval es 0, instante en el que el valor de semzcnt es decrementeado.

       •      El semáforo es eliminado: la llamada al sistema falla con errno fijada a EIDRM.

       •      El proceso que lo invoca captura una señal: 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 modificación sobre el semáforo.  Si
       semval  es  mayor  que  o  igual  que  el  valor  absoluto  de  sem_op,  la  operación  puede  ejecutarse
       inmediatamente:  el  valor  absoluto de sem_op es restado a semval.  y, si SEM_UNDO es invocado para esta
       operación, el sistema actualiza el contador "undo" del proceso (semadj) para este semáforo.  Si el  valor
       absoluto  de  sem_op  es  mayor  que semval, y IPC_NOWAIT está 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  número de procesos esperando a que se incremente el valor de este semáforo) es incrementado en uno y
       el proceso duerme hasta que ocurra:

       •      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 operación, el sistema actualiza el contador "undo" del proceso (semadj) para este semáforo.

       •      El semáforo es es eliminado del sistema: la llamada al sistema falla con errno fijado a EIDRM.

       •      El proceso invocador captura una señal: 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 semáforo especificado en el array apuntado por
       sops es fijado al identificador del proceso del proceso invocador.  Además 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 tendrá uno de los siguientes valores:

       E2BIG      El argumento nsops es mayor que SEMOPM, el numero máximo de operaciones permitidas por llamada
                  del sistema.

       EACCES     El proceso invocador no tiene permisos de acceso al semáforo como se requiere por una  de  las
                  operaciones especificadas.

       EAGAIN     Una  operación  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
                  semáforos en el conjunto.

       EIDRM      El conjunto de semáforos ha sido eliminado.

       EINTR      Mientras estaba bloqueado en esta llamada al sistema, el proceso capturó una señal.

       EINVAL     Este  conjunto  de  semáforos no existe, o semid es menor que cero, o nsops tiene un valor no-
                  positivo.

       ENOMEM     El sem_flg de alguna operación 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 máximo dependiente de la
                  implementación para semval.

OBSERVACIONES

       Las estructuras sem_undo de un proceso no son heredadas tras la ejecución de fork(2) , pero  sí  tras  la
       ejecución  de execve(2).  semop no es reiniciada nunca automáticamente después de haber sido interrumpida
       por un manejador de señales,  sin  importar  que  las  banderas  SA_RESTART  estén  presentes  cuando  se
       establezca el manejador señales.

       semadj  es  un  entero  por  cada  proceso  que  representa simplemente el número (negativo) de todas las
       operaciones sobre semáforos realizadas con la bandera SEM_UNDO.   Cuando  se  establece  directamente  el
       valor  de  un  semáforo 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  semáforo  pueden  ser  obtenidos  usando  llamadas
       semctl(2) apropiadas.

       Los siguientes valores son limites en el conjunto de recursos de los semáforos q ue afecta a semop

       SEMOPM Numero máximo de operaciones permitidas para una llamada (32) semop.

       SEMVMX Valor máximo permitido para semval: dependiente de la implementación (32767).

       La  implementación no contiene límites intrínsecos para ajustar el valor máximo de la salida (SEMAEM), el
       numero máximo de estructuras "undo" que el sistema permite (SEMMNU) y máximo 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 semáforos  que  realizó  con  la  bandera  SEM_UNDO.   Esto  conlleva  una
       dificultad: si una (o más) de estas modificaciones sobre semáforos resultara en un intento de decrementar
       el  valor  de  un  semáforo  por  debajo  de  cero,  ¿qué  debería hacer una implementación?  Una posible
       aproximación sería bloquearse hasta que todas las modificaciones sobre semáforos puedan  ser  realizadas.
       Esto  no  es  deseable  sin  embargo puesto que podría bloquear la terminación del proceso durante largos
       períodos arbitrarios.  Otra posibilidad sería ignorar tales modificaciones sobre semáforos  por  completo
       (algo  análogo  a  un  fallo  cuando se especifica IPC_NOWAIT para una operación sobre semáforos).  Linux
       adopta un tercer enfoque: decrementar el valor del semáforo tanto como sea posible (p.e., hasta  cero)  y
       permitir la terminación del proceso inmediatamente.

CONFORME A

       SVr4, SVID.  SVr4 documenta las condiciones de error adicionales EINVAL, EFBIG, ENOSPC.

VÉASE TAMBIÉN

       ipc(5), semctl(2), semget(2), sigaction(2)

Linux 2.4                                         8 enero 2002                                          SEMOP(2)