NOME
ipc − Mecanismo de inter-comunicação do System V
SINOPSE
# include
<sys/types.h>
# include <sys/ipc.h>
# include <sys/msg.h>
# include <sys/sem.h>
# include <sys/shm.h>
DESCRIÇÃO
Esta página do manual referese a implementação para o Linux do mecanismo de inter-comunicação usado no System V: fila de mensagens, sinalização por semáfaros e segmentos compartilhados de memória. Na seqüencia, a palavra resource significa uma instância de um entre muitos mecanismos.
Permissão
de Acessos aos Recursos
Para cada recurso o sistema usa uma estrutura comum do tipo
struct ipc_perm para armazernar
informações necessárias na
determincação das permissões para
executar uma operação ipc. A estrutura
ipc_perm , definida pelo arquivo de cabeçalho
do sistema <sys/ipc.h> , incluí os
seguintes membros:
ushort cuid; |
/* identificação numérica do usuário criador*/ | |||
ushort cgid; |
/* identificação numérica do grupo criador*/ | |||
ushort uid; /* identificação numérica do usuário proprietário*/ |
||||
ushort gid; /* identificação numérica do grupo proprietário*/ |
||||
ushort mode; /* r/w permissões */ |
O modo membro da estrutura ipc_perm determina, com ele abaixo de 9 bits, a permissão de acesso para o recurso para um processo executando uma chamada de sistema ipc. As permissões são interpretadas como segue:
0400 |
Leitura pelo usuário. | ||
0200 |
Escrita pelo usuário. | ||
0040 |
Leitura pelo grupo. | ||
0020 |
Escrita pelo grupo. | ||
0004 |
Leitura pelos demais. | ||
0002 |
Escrita pelos demais. |
Os bits 0100, 0010 e 0001 (os bits para execução) não são usados pelo sistema. Furthermore "escrita" significa efetivamente "modificar" para um conjunto de sinalizações.
O arquivo cabeçalho de sistema define as seguintes constantes simbólicas:
IPC_CREAT |
Criar a entrada se a chave não existe. |
|||
IPC_EXCL |
Falhar se a chave existe. |
|||
IPC_NOWAIT |
Errar se a requesição esperar muito. |
|||
IPC_PRIVATE |
Chave privada. |
|||
IPC_RMID |
Remover recurso. |
|||
IPC_SET |
Fixar opção do recurso. |
|||
IPC_STAT |
Pegar opção do recurso. |
Note que IPC_PRIVATE é um tipo key_t , enquanto todos as outras constantes simbólicas são campos flag ou-hábil dentro de uma variável tipo int
Fila de
mensagens
Uma fila de mensagens é unicamente identificada por
un inteiro positivo (its msqid) e possui uma
estrutura de dados associada do tipo struct
msquid_ds, definida em <sys/msg.h>,
contendo os seguintes membros:
struct
ipc_perm msg_perm;
ushort msg_qnum; /* nada de mensagens na fila */
ushort msg_qbytes; /* máximo de bytes na fila */
ushort msg_lspid; /* pid da última chamada msgsnd
*/
ushort msg_lrpid; /* pid da última chamada msgrcv
*/
time_t msg_stime; /* última hora de msgsnd */
time_t msg_rtime; /* última hora de msgrcv */
time_t msg_ctime; /* úlitma hora de
alteração */
msg_perm |
ipc_perm estruturas que especificam a permissão de acesso na fila de mensagem. | ||
msg_qnum |
Número de mensagems atualmente na fila de mensagens. | ||
msg_qbytes |
Número máximo de bytes de texto de mensagem texto permetida na fila de mensagens. | ||
msg_lspid |
ID do processo que executou a última chamada de sistema msgsnd | ||
msg_lrpid |
ID do processo que executou a última chamada de sistema msgrcv | ||
msg_stime |
A hora da última chamada de sistema msgsnd | ||
msg_rtime |
A hora da última chamada de sistema msgcv | ||
msg_ctime |
A hora da última chamada de sistema que alterou um membro da estrutura msqid_ds |
Conjunto
sinalizador
Um conjunto sinalizador é unicamente identificado por
um inteiro positivo (its semid) e possui uma
estrutura de dados associada do tipo struct semid_ds,
definida em <sys/sem.h>, contendo os seguintes
membros:
struct
ipc_perm sem_perm;
time_t sem_otime; /* tempo da última
operação */
time_t sem_ctime; /* tempo da última
alteração */
ushort sem_nsems; /* contagem de sems no conjunto */
sem_perm |
ipc_perm estruturas que especificam a permissão de acesso no conjunto sinalizador. | ||
sem_otime |
Hora da última chamada de sistema semop | ||
sem_ctime |
Hora da última chamada de sistema semctl que alterou um membro de uma estrutura citada acima ou um dos sinais pertencentes ao conjunto. | ||
sem_nsems |
Número de sinais no conjunto. Cada sinal de um conjunto é referenciado por um inteiro não negativo desde 0 até sem_nsems−1. |
Um sianl é uma estrutura de dados do tipo struct sem contendo os seguintes membros:
ushort
semval; /* valor do sinal */
short sempid; /* pid para a última
operação */
ushort semncnt; /* número de espera semval para
adicionar */
ushort semzcnt; /* número de espera semval = 0
*/
semval |
Valor do sinal: um interio não negativo. | ||
sempid |
ID do último processo que executou uma operação sinalizada neste sinal. | ||
semncnt |
Número de processos supendidos aguardando por semval para adicionar. | ||
semznt |
Número de processos supendidos aguardando por semval para se transformar em zero. |
Segmentos
Compartilhados de Memória
Um segmento compartilhado de memória é
unicamente identificado por um inteiro positivo (its
shmid) e possui uma estrutura de dados associada do
tipo struct shmid_ds, definida em
<sys/shm.h>, contendo os seguintes membros:
struct
ipc_perm shm_perm;
int shm_segsz; /* tamanho do segmento */
ushort shm_cpid; /* pid do criador */
ushort shm_lpid; /* pid, da última
operação */
short shm_nattch; /* número atual de
uniões */
time_t shm_atime; /* hora da última união
*/
time_t shm_dtime; /* hora da úlitma
desunião */
time_t shm_ctime; /* hora da úlitma
alteração */
shm_perm |
ipc_perm estrutura que especifica as permissões de acesso no segmento compartilhado de memória. | ||
shm_segsz |
Tamanho em bytes do segmento compartilhado de memória. | ||
shm_cpid |
ID do processo que criou o segmento compartilhado de memória | ||
shm_lpid |
ID do úlitmo processo que executou uma chamada de sistema shmat ou shmdt | ||
shm_nattch |
Número de uniões atuais ativas para este segmento compartilhado de memória. | ||
shm_atime |
Hora da úlitma chamada de sistema shmat | ||
shm_dtime |
Hora da úlitma chamada de sistema shmdt | ||
shm_ctime |
Hora da última chamada de sistema shmctl que alterou shmid_ds. |
VEJA TAMBÉM
ftok(3), msgctl(2), msgget(2), msgrcv(2), msgsnd(2), semctl(2), semget(2), semop(2), shmat(2), shmctl(2), shmget(2), shmdt(2).
TRADUZIDO POR LDP-BR em 21/08/2000.
André L. Fassone Canova <lonelywolf [AT] blv.br> (tradução) Carlos Augusto Horylka <horylka [AT] conectiva.br> (revisão)