Next: Exemplo de operação sobre
Up: Os Semáforos
Previous: A Função semctl()
# include <sys/types.h>
# include <sys/ipc.h>
# include <sys/sem.h>
int semop ( int semid, struct sembuf *sops, unsigned nsops )
Valor de retorno: o valor de semval do último
semáforo manipulado ou -1 em caso de erro.
A função semop() permite de efetuar operações sobre os
semáforos identificado por semid. Cada um dos (nsops)
elementos no array de estruturas do tipo struct sembuf
apontado por sops especifica uma operação a ser realizada no
semáforo.
A estrutura sembuf (ver seção 5.2.1) especifica o
número do semáforo que será tratado (sem_num), a operação
que será realizada sobre este semáforo(sem_op), e os flags
de controle da operação (sem_flag).
O tipo de operação realizada vai depender do valor armazenado no
membro sem_op:
- Se sem_op < 0 (pedido de recurso) então:
- Se semval é maior ou igual a |sem_op|, então
semval = semval - |sem_op|;
- Se semval é menor que sem_op, então o
processo se bloqueia até que semval seja maior ou igual a
|sem_op|;
- Se sem_op = 0, o processo deve ler as permissões de
acesso do conjunto de semáforos.
- Se semval é menor ou igual a 0, a chamada retorna;
- Se semval é maior que 0, o processo se bloqueia até que
semval=0
- Se sem_op > 0 (restituição de recurso): então
semval = semval + |sem_op|
Quando as operações semop() no semáforo utilizarem apenas os
valores de sem_op iguais a 1 ou -1, tem-se o funcionamento
dos semáforos conhecidos como semáforos de Dijsktra (veja seção
5.6).
Existem entretanto uma gama de operações possíveis utilizando
sem_op. A implementação torna-se nesse caso muito mais
complexa e a demonstração das garantias de exclusão mútua entre as
operações é extremamente delicada.
Os flags reconhecidos em sem_flg são IPC_NOWAIT e
SEM_UNDO. Se a operação coloca SEM_UNDO como flag,
ele será desfeita quando o processo termina (exit()). Em resumo:
- IPC_NOWAIT : evita o bloqueio do processo, retornando
um código de erro.
- SEM_UNDO : todas as modificações feitas sobre os
semáforos são desfeitasquando o processo morre. Durante toda a vida
do processo, as operações efetuadas com o flag SEM_UNDO
sobre todos os semáforos de todos os identificadores são acumulados,
e na morte do processo, o sistema ''refaz''todas essa operações ao
inverso. Isto possibilita não bloquear indefinidamente os processos
sobre os semáforos, após a morte acidental de um processo. Note que
este tipo de procedimento é custoso, tanto do ponto de vista de
carga para a CPU, quanto do ponto de vista da memória gasta.
Subsections
Next: Exemplo de operação sobre
Up: Os Semáforos
Previous: A Função semctl()
Celso Alberto Saibel Santos
2000-11-14