Função shmget 2 c

Função shmget 2 c
A função shmget () é usada para construir uma nova fila de mensagens ou obter acesso a uma existente. A memória compartilhada está entre os métodos de comunicação entre processos que permitem dois ou mais processos para trocar rapidamente os dados e se comunicar no espaço do usuário. A memória compartilhada refere -se a quando vários processos acessam a mesma região de memória e podem modificá -la ou acessá -la conforme necessário. Para esclarecer, cada processo possui seu endereço de memória; Se um processo deseja transmitir os dados de sua memória do sistema para os outros processos, apenas os mecanismos IPC de comunicação entre processos estão disponíveis.

A comunicação pode ocorrer entre os sistemas que estão conectados ou não relacionados, como todos sabemos. O método de chamada do sistema shmget é usado para estabelecer um novo segmento de memória compartilhada ou localizar um existente usando uma chave. Os segmentos de memória compartilhados são seções de memória que podem ser acessadas por vários processos e que, uma vez estabelecidos, permanecem disponíveis até serem explicitamente destruídos com a função shmctl. Este artigo mostrará como usar a função SHMGET SYSTEM CHAMADA na linguagem C para alocar a memória compartilhada de várias maneiras.

Sintaxe da função de chamada do sistema shmget na linguagem C

int shmget (key_t key, tamanho_t tamanho, int shmflg);

Aqui, temos uma sintaxe geral da função de chamada do sistema shmget. Existem diferentes parâmetros passados ​​na função shmget. Esses parâmetros são explicados em detalhes na seguinte discussão.

O valor da chave do parâmetro é retornado por shmget () que retorna o segmento de memória compartilhado de identificação do sistema V. Se a chave for privada do IPC ou não do IPC privado, não existe segmento de memória compartilhado equivalente à chave, e o CREAT IPC é definido no SHMFLG, uma nova segmentação de memória compartilhada com um tamanho equivalente ao valor do tamanho escalado até um múltiplo O tamanho da página é produzido. (Isso é semelhante ao efeito aberto (2) de O CREAT | o excl).

O tamanho necessário do segmento é especificado pelo argumento do tamanho. Se o segmento ocorrer atualmente, o tamanho não poderá exceder o tamanho fornecido quando foi criado. Além disso, para definir quais usuários estão autorizados a acessar ou alterar o segmento de memória, qualquer uma das autoridades Irusr, s iwusr, s irgrp, s iwgrp, s iroth e s iwoth podem ser fornecidas.

Exemplo

O código de exemplo mostra como usar as funções de chamada SHMGET e SHMAT SYSTEM em um único processo para criar um novo segmento compartilhado e depois escrever algum texto nele. O código de amostra também mostra que os múltiplos processos podem transmitir usando a memória coletiva.

#incluir
#incluir
#incluir
#incluir
#incluir
#incluir
#incluir
#incluir
enum segment_size = 0x6400;
const char *data = "Ei, aí!";
int main (int argc, char *argv [])
status int;
int segment_id;
segment_id = shmget (ipc_private, segment_size,
Ipc_creat | IPC_EXCL | S_irusr | S_iwusr);
char *sh_mem = (char *) shmat (segment_id, 0, 0);
printf ("ID do segmento %d \ n", segment_id);
printf ("anexado em %p \ n", sh_mem);
Memmove (sh_mem, dados, strlen (dados) +1);
printf ("%s \ n", sh_mem);
pid_t child_pid = fork ();
if (child_pid == -1)
Perror ("Fork");
if (child_pid == 0)
strcpy (sh_mem, "novos dados no processo infantil \ 0");
printf ("Child pid: %d \ n", getpid ());
saída (exit_success);
outro
pid_t ret = waitpid (child_pid, & status, wuntracted | wcontinued);
if (ret == -1)
perror ("waitpid");
if (wifexited (status))
printf ("Status do filho saiu: %d \ n", wexitstatus (status));
if (wexitstatus (status) == 0)
printf ("%s \ n", sh_mem);

shmdt (sh_mem);
shmctl (segment_id, ipc_rmid, 0);
saída (exit_success);

Primeiro, incluímos alguns arquivos de cabeçalho aplicáveis. A capacidade de memória compartilhada é definida no “SYS/SHM.arquivo de cabeçalho H ”. Comece com a implementação do código. Definimos o tamanho do segmento utilizando o método enum. A variável é declarada como os dados em que a string é inicializada. Então, temos a principal chamada de função. Na principal função deste exemplo, as variáveis ​​são definidas e inicializadas. O SEGEMENT_ID é inicializado com o método shmget. A chave do segmento de memória é o primeiro dos três argumentos passados ​​para o método shmget. Se um novo segmento precisar ser estabelecido, o valor -chave pode ser a macro privada do IPC ou o valor -chave de um segmento existente se a chamada precisar obter a identificação da memória.

O tamanho do segmento é especificado pelo segundo argumento e os sinalizadores de permissão, que podem ser ou ed para adicionar valores possíveis, são especificados pelo terceiro argumento de shmget.

O identificador do segmento é recebido após a formação do segmento de memória e pode ser enviado à função shmat para conectar o segmento de memória. Como uma segunda entrada para o shmat, o usuário pode especificar o endereço onde o segmento de memória deve ser anexado. Ainda assim, é mais comum permitir que o kernel determine o endereço e use nulo para indicar que. A função Printf imprime o valor do ID do segmento e a memória compartilhada anexada e imprime a string "Hey, lá".

O processo primário “PID_T” garfos e um processo infantil “Child_Pid” são gerados, cada um dos quais salva uma sequência distinta no mesmo endereço. Enquanto isso, o processo pai interrompe e espera que a criança termine e depois sai com um código bem -sucedido. A sequência recém -salva é escrita no console. Se muitos processos precisam alterar e adquirir os segmentos de memória compartilhada ao mesmo tempo, técnicas de sincronização, como semáforos, devem ser usadas.

A execução do código anterior gera uma saída como esta. O ID do segmento é gerado, o endereço de memória compartilhado é exibido e a string também é impressa no prompt. A criança PID e o status da criança saídos são gerados junto com a mensagem "Novos dados no processo infantil".

Conclusão

Examinamos a função de chamada do sistema shmget em grande detalhe neste post. A função shmget () recupera a identificação de memória compartilhada da chave. Através da função de chamada do sistema shmget, podemos obter a memória compartilhada. Antes que possamos usar a função shmget (), precisamos importar muitas bibliotecas. Esta função contém os parâmetros que controlam uma variedade de funções. Esta posta.