Posix compartilhou memória com programação C

Posix compartilhou memória com programação C
A memória compartilhada POSIX é uma estrutura para comunicação entre processos (IPC) especificada nas especificações do POSIX. Duas (ou mais) tarefas podem ler e escrever na zona de memória compartilhada enquanto estabelece a memória compartilhada. A memória compartilhada POSIX nem sempre aplica desembolsos de cópias, em contraste com outras estruturas do IPC (e.g., tubo, soquete, etc.), e é desejável para certos programas.

Chamadas de memória compartilhada POSIX

As funções de memória compartilhada POSIX focaram no conceito UNIX de que o objeto deve ser um documento ao executar atividades de entrada/saída em uma entidade. Portanto, como você recita e inscreve em uma entidade de memória Posix mútua, o último deve ser considerado como um documento. Um documento mapeado de memória é uma entidade de memória compartilhada POSIX. Para usar o shm_open Função de chamada do sistema abaixo /dev/shm, Documentos de memória compartilhada separados são gerados. Existem apenas duas chamadas de sistema de memória compartilhada dedicadas da Posix, shm_open, e shm_unlink, que estão intimamente relacionados à abertura e desconhecimentos do sistema de arquivos chamadas. O ftruncato, mmap, e Munmap As chamadas da estrutura para documentos são usadas para executar outras tarefas na memória compartilhada POSIX. É necessário conectar um programa que usa chamadas de memória compartilhada POSIX para -lrt.

Os programas usando chamadas de memória compartilhada POSIX devem seguir as seguintes etapas:

Usando shm_open (), formar um objeto de memória compartilhado. O descritor do documento pode ser revertido se a formação do objeto for bem -sucedida.

Com ftruncato (), O tamanho do objeto será corrigido.

Com mapa() e Map_shared, delinear este objeto no presente espaço de endereço.

Leia/escreva a memória compartilhada.

Através da Munmap (), não delinear a memória compartilhada.

Usar fechar() para fechar o objeto.

Através shm_unlink (), Exclua o objeto na memória compartilhada.

shm_open ()

Como descrito acima, shm_open () é usado para gerar um novo objeto de memória compartilhada. Torna o objeto acessível ao procedimento de chamada usando o descritor revertido. A seguir, é apresentada a definição desta chamada de função:

>> int shm_open (const char *nome, int ofLag, modo mode_t);

O primeiro parâmetro é o nome do objeto de memória compartilhado. É uma sequência de terminado nulo do /nome tipo, com a estipulação de que nenhum outro personagem pode ser uma barra além de seu primeiro personagem. Oflag é um pequeno véu criado com várias das bandeiras anteriores por ou O_RDONLY ou O_RDWR. Os parâmetros descritos indicam que seu objeto de memória compartilhada deve ser formada (O_creat) quando ainda não existe e também o objeto está disponível para leitura e escrita (O_RDWR). O último argumento define as aprovações do diretório para o objeto de memória compartilhada.

shm_unlink ()

Shm_unlink () elimina a entidade de memória compartilhada POSIX que foi desenvolvida anteriormente. O descritor de documentos inteiros para o objeto de memória compartilhada é retornada por meio de uma chamada eficaz para shm_open (). Conforme definido sob o shm_open (), O nome do parâmetro é o título da entidade de memória compartilhada. A seguir é a definição do shm_unlink () função:

>> int shm_unlink (const char *nome);

ftruncato ()

Ao definir o objeto, o ftruncato () O método é eliminado para configurar o tamanho da entidade em bytes. A definição da função é a seguinte:

>> int ftruncato (int fd, off_t comprimento);

Ao construir uma memória POSIX compartilhada, é de fato zero bytes em capacidade de tamanho. Você pode renderizar a entidade de memória compartilhada POSIX com bytes de comprimento de tamanho via ftruncato. Ftruncato produz zero na execução. Ftruncato saídas -1 em caso de falha e errno está definido para acionar o erro.

mmap ()

Eventualmente, um documento mapeado de memória com a entidade de memória compartilhada é definida através do mmap () método. Em seguida, ele produz um ponteiro de documento mapeado pela memória que é eliminado para alcançar a entidade de memória compartilhada. A seguir é a definição do mmap () função:

>> void *mmap (void *addr, size_t comprimento, int prot, int sinalizadores, int fd, off_t offset);

Nisso, 'addr' é o endereço para o qual será mapeado. O 'comprimento' é o alcance da entidade de memória compartilhada. Os valores para o ProT podem diferir, mas usaremos a leitura do prot | Prot Write. Existem várias bandeiras, mas o mapa compartilhado é essencial para a memória compartilhada. Agora, 'FD' é um descritor de documentos que foi obtido anteriormente. O deslocamento é o ponto em que o mapeamento começa na entidade de memória compartilhada; O valor de deslocamento 0 também pode ser usado. Após a conclusão, mmap () produz o ponteiro para a posição de mapeamento da entidade de memória compartilhada.

Munmap ()

Na posição direcionada por Addr e obtenção de tamanho, comprimento, Munmap impede o item de memória compartilhada. Munmap rende 0 após a conclusão e -1 na situação de imprecisão; nesse caso, o erro é atribuído para acionar o erro.

>> void munmap (void *addr, size_t comprimento);

Exemplo: remetente e receptor

Vamos dar o exemplo do remetente e do receptor. O remetente criará um novo objeto de memória compartilhada com o nome /SHMEM-Exemplo e inscreva três numerais na memória compartilhada através dele. Agora, o receptor pode expor o objeto de memória compartilhada e recitar os três números da memória. Vamos criar três arquivos com os nomes protocolo.H, remetente.c, e receptor.c.

$ Touch Protocol.h
$ touch remetente.c
$ touch receptor.c

Em seguida, adicionaremos o código -fonte abaixo ao protocolo dos arquivos.H, "remetente.C, 'e' Receptor.c.'Agora, vamos salvar tudo e fechá -los.

Agora estaremos compilando e juntando o código acima usando a palavra -chave -lrt separadamente para o remetente.C e receptor.Arquivo C. Aqui está o comando para fazer isso:

$ gcc -o remetente remetente.C -lrt
$ GCC -O Receptor.C -lrt

Agora, executaremos o código do remetente usando o seguinte comando. A saída é dada abaixo.

$ ./remetente

Executando o código do remetente, o objeto de memória compartilhado foi gerado e pode ser encontrado abaixo /dev/shm Usando o comando abaixo:

$ ls -l /dev /shm | Grep Shmem-Exemplo

Quando executamos o código do receptor, obteremos a saída abaixo:

$ ./receptor

Sempre que a função gm_unlink () é chamado usando o arquivo 'receptor.C, 'o objeto /Dev/shm/shmem-exemplo será destacado. Nesse caso, você não obterá nenhum objeto na saída, como mostrado abaixo.

$ ls -l/dev/shm/shmem -exemplo

Conclusão

Neste artigo, você aprendeu a usar a memória compartilhada POSIX com a programação C no Ubuntu 20.04, incluindo todas as chamadas de função usadas para estabelecer memória compartilhada. Espero que este artigo tenha ajudado você a melhorar seu conhecimento de programação e abordar cada dúvida que você tem sobre este assunto.