next up previous
Next: A Função semctl() Up: A Função semget() Previous: A Função semget()

Como criar um conjunto de semáforos

Para criar um conjunto de semáforos, deve-se obedecer os seguintes passos:

  1. key deve contar um valor identificando um conjunto de semáforos (diferente de IPC_PRIVATE=0);

  2. semflg deve conter os direitos de acesso desejados para o semáforo, e a constante IPC_CREATE;

  3. Se deseja-se testar a existência de um conjunto correspondente a uma chave key determinada, deve-se adicionar (usando o operador OU) ao argumento semflg a constante IPC_EXCL. A chamada à função semget() irá falhar no caso da existência de um conjunto associado à chave.

Note ainda que durante a criação de um conjunto de semáforos, um certo número de campos da estrutura semid_ds são iniciados (proprietário, modo de acesso, etc). Faça man semget para obter a lista completa dos parâmetros modificados com a chamada semget. No caso do exemplo, o valor 0600 garante ao usuário as permissões de escrita e leitura do array de semáforos.

Exemplo

O programa test_semget.c cria um conjunto de 4 semáforos associados à chave 123.

              /* arquivo test_semget.c */

/* exemplo de uso de semget() */

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

#define KEY 123

int main()
{
  int semid ;  /* identificador dos semaforos */
  char *path = "nome_de_arquivo_existente" ;
  
    /* alocacao de 4 semaforos */
     if (( semid = semget(ftok(path,(key_t)KEY), 4,
                       IPC_CREAT|IPC_EXCL|0600)) == -1) {
          perror("Erro de semget") ;
          exit(1) ;
     }
   printf(" O semid do conjunto do semaforo e : %d\n",semid) ;
   printf(" Este conjunto e identificado pela chave unica : %d\n"
                            ,(int) ftok(path,(key_t)KEY)) ;
   exit(0);
}

Resultado da execução:

euler:~/> test_semget
 O semid do conjunto do semaforo e : 1920
 Este conjunto e identificado pela chave unica : 2063902908

euler:~/> test_semget
Erro de semget: File exists

euler:~/> ipcs -s

------ Semaphore Arrays --------
key       semid     owner     perms     nsems     status      
0x7b04a8bc 1920      saibel    600       4


next up previous
Next: A Função semctl() Up: A Função semget() Previous: A Função semget()
Celso Alberto Saibel Santos 2000-11-14