next up previous
Next: Função shmat() Up: Memória Compartilhada Previous: Como criar um segmento

A Função shmctl()

   #include <sys/ipc.h>
   #include <sys/shm.h>

   int shmctl(int shmid, int cmd, struct shmid_ds *buf);

Valor de retorno: 0 em caso de sucesso, senão -1.

A função semctl() é utilizada para examinar e modificar as informações relativas ao segmento de memória compartilhada. De maneira intuitiva, ela permite ao usuário de receber informações relativas ao segmento, de setar o proprietário ou grupo, de especificar as permissões de acesso, e finalmente, de destruir o segmento.

A função utiliza três argumentos: um identificador do segmento de memória compartilhada shmid, um parâmetro de comando cmd e um ponteiro para uma estrutura do tipo shmid_ds associada pelo sistema ao segmento de memória onde a operação será executada.

O argumento cmd pode conter os seguintes valores:

O super usuário pode ainda evitar ou permitir o swap do segmento de memória compartilhada usando os valores SHM_LOCK (3) (evitar o swap e SHM_UNLOCK (4) (permitir o swap).

Exemplo:

Neste exemplo, supõe-se que o segmento de memória compartilhada tem a chave de acesso 123 utilizada no exemplo anterior:

                 /* arquivo test_shmctl.c */

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

#define KEY 123

struct shmid_ds buf ;

int main()
{
  char *path = "nome_de_arquivo_existente" ;
  int shmid ;
  int size = 1024 ;

  /* recuperacao do identificador do segmento associado a chave 123 */
     if (( shmid = shmget(ftok(path,(key_t)KEY),size,0)) == -1 ) {
          perror ("Erro shmget()") ;
          exit(1) ;
     }
      /* recuperacao das informacoes realtivas ao segmento */
     if ( shmctl(shmid,IPC_STAT,&buf) == -1){
          perror("Erro shmctl()") ;
          exit(1) ;
     }
     printf("ESTADO DO SEGMENTO DE MEMORIA COMPARTILHADA %d\n",shmid) ;
     printf("ID do usuario proprietario: %d\n",buf.shm_perm.uid) ;
     printf("ID do grupo do proprietario: %d\n",buf.shm_perm.gid) ;
     printf("ID do usuario criador: %d\n",buf.shm_perm.cuid) ;
     printf("ID do grupo criador: %d\n",buf.shm_perm.cgid) ;
     printf("Modo de acesso: %d\n",buf.shm_perm.mode) ;
     printf("Tamanho da zona de memoria: %d\n",buf.shm_segsz) ;
     printf("pid do criador: %d\n",buf.shm_cpid) ;
     printf("pid  (ultima operacao): %d\n",buf.shm_lpid) ;
 
     /* destruicao do segmento */
     if ((shmctl(shmid, IPC_RMID, NULL)) == -1){
          perror("Erro shmctl()") ;
          exit(1) ;
     }
     exit(0);
}

Resultado da execução

euler:~/> test_shmctl 
ESTADO DO SEGMENTO DE MEMORIA COMPARTILHADA 35968
ID do usuario proprietario: 1145
ID do grupo do proprietario: 1000
ID do usuario criador: 1145
ID do grupo criador: 1000
Modo de acesso: 384
Tamanho da zona de memoria: 1024
pid do criador: 930
pid  (ultima operacao): 0
euler:~> ipcs -m

------ Shared Memory Segments --------
key       shmid     owner     perms     bytes     nattch    status


next up previous
Next: Função shmat() Up: Memória Compartilhada Previous: Como criar um segmento
Celso Alberto Saibel Santos 2000-11-14