# 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