O procedimento é exatamente o mesmo que aquele empregaado para gerar um conjunto de semáforos (seção 5.3). As seguintes regras gerais devem ser entretanto observadas:
Note finalmente que durante a criação do segmento de memória compartilhada, um certo número de membros da estrutura shmid_ds serão também inicializados (por exemplo, o proprietário, os modos de acesso, a data de criação, etc). Faça man shmget para maiores detalhes.
Exemplo de utilização de shmget
Este programa cria um segmento de memória compartilhada associado à chave 123.
/* fichier test_shmget.c */ /* exemplo de utilizacap de shmget() */ #include <errno.h> #include <sys/ipc.h> #include <sys/shm.h> #include <stdio.h> #define KEY 123 int main() { int shmid ; /* identificador da memoria comum */ int size = 1024 ; char *path="nome_de_arquivo_existente" ; if (( shmid = shmget(ftok(path,(key_t)KEY), size, IPC_CREAT|IPC_EXCL|SHM_R|SHM_W)) == -1) { perror("Erro no shmget") ; exit(1) ; } printf("Identificador do segmento: %d \n",shmid) ; printf("Este segmento e associado a chave unica: %d\n", ftok(path,(key_t)KEY)) ; exit(0); }
Resultado da execução:
Lançando duas vezes a execução do programa, tem-se o seguinte resultado:
euler:~> test_shmget Identificador do segmento: 36096 Este segmento e associado a chave unica: 2063804629 euler:~> ipcs -m ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x7b0328d5 36096 saibel 600 1024 0 euler:~> test_shmget Erro no shmget: File exists