• No se han encontrado resultados

SISTEMAS OPERATIVOS

ERRORES EACCES

Existe un conjunto de semáforos para key, pero el proceso que realiza la llamada no tiene permisos de acceso al conjunto.

EEXIST

Existe un conjunto de semáforos para key y semflg tiene a 1 tanto IPC_CREAT como IPC_EXCL. EIDRM

El conjunto de semáforos está marcado para ser borrado. ENOENT

No existe ningún conjunto de semáforos para key y semflg no tiene a 1 IPC_CREAT. ENOMEM

Se ha de crear un conjunto de semáforos, pero el sistema no tiene suficiente memoria para la nueva estructura de datos.

ENOSPC

Se ha de crear un conjunto de semáforos, pero el límite del sistema para el número máximo de conjuntos de semáforos (SEMMNI), o el número de semáforos máximo del sistema (SEMMNS), sería excedido.

NOTAS

IPC_PRIVATE no es un campo bandera (flag), sino que es de tipo key_t Si este valor especial es usado para key, la llamada del sistema ignora todo excepto los 9 bits más bajos de semflg y crea un nuevo conjunto de semáforos (si hay éxito).

SISTEMAS OPERATIVOS II

43 DE 48–CÁTEDRA SISTEMAS OPERATIVOS II–2006 Los siguientes son límites de los recursos de los conjuntos de semáforos que afectan a la llamada semget :

SEMMNI

Máximo total de conjuntos de semáforos para el sistema: depende de la política. SEMMSL

Máximo de semáforos por semid: depende de la implementación (500 normalmente). SEMMNS

Máximo total de semáforos para el sistema: depende de la política. Valores mayores que SEMMSL * SEMMNI lo hacen irrelevante.

FALLOS

El uso de IPC_PRIVATE no inhibe el acceso de los demás procesos al conjunto de semáforos asignado.

Al igual que pasa con los ficheros, no hay una manera intrínseca para que un proceso se asegure el acceso exclusivo a un conjunto de semáforos. Tener a 1 tanto IPC_CREAT como IPC_EXCL en semflg solo asegura (si hay éxito) la creación de un nuevo conjunto de semáforos, no implica acceso exclusivo a dicho conjunto.

La estructura de datos asociada con cada semáforo del conjunto no es inicializada por la llamada del sistema. Para inicializar estas estructuras de datos, se ha de ejecutar la subsiguiente llamada a semctl(2) para realizar un comando SETVAL o SETALL en el conjunto de semáforos.

CONFORME A

SVr4, SVID. SVr4 documenta condiciones de error adicionales EINVAL, EFBIG, E2BIG, EAGAIN, ERANGE, EFAULT. VÉASE TAMBIÉN

ftok(3), ipc(5), semctl(2), semop(2)

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

Esta función ejecuta operaciones en los miembros seleccionados del semáforo 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 por struct sembuf incluyendo los siguientes miembros:

short sem_num; /* numero de semáforo: 0 = primero */ short sem_op; /* operación sobre el semáforo */

SISTEMAS OPERATIVOS II

44 DE 48–CÁTEDRA SISTEMAS OPERATIVOS II–2006 Banderas reconocidas en sem_flg son IPC_NOWAIT y SEM_UNDO. Si una operación ejecuta SEM_UNDO, sera deshecha cuando el proceso finalice.

La semántica de la llamada al sistema asegura que la operación erá ejecutada si y solo si todas ellas pueden ser ejecutadas. Cada operación es ejecutada en el semáforo numero sem_num donde el primer semáforo del conjunto es el semáforo 0 - y es uno entre los siguientes tres.

Si sem_op es un entero positivo, la operación añade este valor a semval. Sin embargo, si SEM_UNDO es invocado para esta operación , el sistema actualiza el contador del proceso (para operaciones "undo") para este semáforo. La operación siempre se ejecuta, por lo que no puede haber ningún proceso durmiendo. El proceso que invoca debe tener los permisos modificados en el conjunto de semáforos.

Si sem_op es cero, el proceso debe tener permiso de lectura en el semáforo. Si semval es cero, la operación se ejecuta. Por otra parte, si IPC_NOWAIT es invocado en sem_flg, la llamada al sistema falla (deshaciendo todas las acciones anteriores ejecutadas) con la variable errno fijada a EAGAIN. En otro caso semzcnt 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 recibe una señal que debe ser atendida: 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, el valor absoluto de sem_op es restado a semval. Por otra parte, si SEM_UNDO es invocado para esta operación, el sistema actualiza el contador "undo" del pro ceso para este semáforo. Entonces la operación se ejecuta. En otro caso, si IPC_NOWAIT es invocado en sem_flg, la llamada al sistema falla (deshaciendo todas las acciones anteriores ejecutadas) con errno fijado a EAGAIN. En otro caso semncnt es incrementado en uno y el proceso duerme hasta que ocurra:

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 para este semáforo.

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

El proceso invocador recibe una señal que tiene que capturar: el valor de semncnt es decrementado y la llamada al sistema falla con errno fijado a EINTR.

En caso de que haya funcionado, el miembro sempid de la estructura sem para cada semáforo especificado en el array apuntado por sops es fijado al identificador del proceso del proceso que la invoca. De otra forma sem_otime y sem_ctime son fijados 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

Documento similar