#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