next up previous
Next: A Função semget() Up: Princípio Previous: Princípio


Estruturas associadas aos semáforos

Cada conjunto de semáforos do sistema é associado a diversas estruturas de dados, tais como semid_ds, sembuf e sem. Todas estas estrturas estão definidas em <sys/sem.h>) e <bits/sem.h>). A compreensão destas estrturas facilitará o entendimento de como o sistema trabalha ao receber as chamadas das primitivas semget(), semctl() e semop().

Por exemplo, a estrutura sembuf é usada como argumento para as operações envolvendo a primitiva semop(), tem a seguinte forma:

struct sembuf
{
  short int sem_num;            /* número do semáforo */
  short int sem_op;             /* operação no semáforo */
  short int sem_flg;            /* flag da operação */
};

A estrutura de dados do conjunto de semáforos é a seguinte:

struct semid_ds
{
  struct ipc_perm sem_perm;             /* operation permission struct */
  __time_t sem_otime;                   /* last semop() time */
  __time_t sem_ctime;                   /* last time changed by semctl() */
  struct sem *__sembase;                /* ptr to first semaphore in array */
  struct sem_queue *__sem_pending;      /* pending operations */
  struct sem_queue *__sem_pending_last; /* last pending operation */
  struct sem_undo *__undo;              /* ondo requests on this array */
  unsigned short int sem_nsems;         /* number of semaphores in set */
};

A estrutura de dados usada para passar as informações sobre as permissões de acesso para as operações IPC é mostrada a seguir:

struct ipc_perm
  {
    __key_t __key;                      /* Key.  */
    unsigned short int uid;             /* Owner's user ID.  */
    unsigned short int gid;             /* Owner's group ID.  */
    unsigned short int cuid;            /* Creator's user ID.  */
    unsigned short int cgid;            /* Creator's group ID.  */
    unsigned short int mode;            /* Read/write permission.  */
    unsigned short int __seq;           /* Sequence number.  */
  };



Celso Alberto Saibel Santos 2000-11-14