# 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