next up previous
Next: As Filas de Mensagens Up: Memória Compartilhada Previous: Função shmat()

Função shmdt()

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

   int shmdt ( const void *shmaddr)

Valor de retorno: 0 em caso de sucesso e -1 em caso de erro.

A função shmdt() desacopla (detaches)o segmento de memória compartilhada especificado pelo endereço shmaddr do espaço de endereçamento processo que a chama. Obviamente, o segmento desacoplado deve ser um dentre os segmentos previamente acoplados pelo processo usando shmat. Este segmento não poderá mais utilizado pelo processo após a chamada da função.

Exemplo:

                 /* arquivo test_shmdt.c */
/*
 * este programa permite a leitura do conteudo de um segmento de
 * memoria compartilhada que foi preenchido por algum processo
 * anteriormente. O processo vai se desacoplar do segmento apos
 * a leitura
 */

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

#define KEY 123
#define MSG "Mensagem escrita na memoria comum"

int main()
{
  int shmid ;  /* identificador da memoria comum */
  int size = 1024 ;
  char *path="nome_de_arquivo_existente" ;
  char *mem ;
  int flag = 0;

     /*
     * recuperacao do shmid 
     */
     if (( shmid = shmget(ftok(path,(key_t)KEY), size,0)) == -1) {
          perror("Erro no shmget") ;
          exit(1) ;
     }
     printf("Sou o processo com pid: %d \n",getpid()) ;
     printf("Identificador do segmento recuperado: %d \n",shmid) ;
     printf("Este segmento e associado a chave unica: %d\n",
                   ftok(path,(key_t)KEY)) ;
    /*
     * acoplamento do processo a zona de memoria 
     * recuperacao do ponteiro sobre a zona de memoria comum
     */
     if ((mem = shmat (shmid, 0, flag)) == (char*)-1){
          perror("acoplamento impossivel") ;
          exit (1) ;
     }
    /*
     * tratamento do conteudo do segmento
     */
     printf("leitura do segmento de memoria compartilhada:\n");
     printf("\t==>%s\n",mem) ;
    /*
     * desacoplamento do segmento
     */
     if (shmdt(mem)== -1){
          perror("acoplamento impossivel") ;
          exit(1) ;
     }
    /*
     * destruicao do segmento
     */
     if ( shmctl(shmid, IPC_RMID,0) == -1){
          perror("destruicao impossivel") ;
          exit(1) ;
     }
     exit(0);
}

Resultado da execução:
Após o lançamento em seqüência dos programas test_shmget (para criar um segmento de memória compartilhada), test_shmat (para acoplar um processo ao segmento e escrever uma mensagem na zona de memória compartilhada) e test_shmdt (para ler o conteúdo, desacoplar e destruir o segmento de memória compartilhada, tem-se a seguinte saída na janela de execução:

euler:~/> test_shmget
Identificador do segmento: 43136 
Este segmento e associado a chave unica: 2063804629
euler:~/> test_shmat
Sou o processo com pid: 788 
Identificador do segmento recuperado: 43136 
Este segmento e associado a chave unica: 2063804629
euler:~/> test_shmdt
Sou o processo com pid: 789 
Identificador do segmento recuperado: 43136 
Este segmento e associado a chave unica: 2063804629
leitura do segmento de memoria compartilhada:
        ==>Mensagem escrita na memoria comum


Celso Alberto Saibel Santos 2000-11-14