#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