Programação C

Memória compartilhada POSIX com programação C

Memória compartilhada POSIX com programação C
A memória compartilhada POSIX é uma estrutura para comunicação entre processos (IPC) especificada nas especificações POSIX. Duas (ou mais) tarefas podem ler a partir dele e gravar na zona de memória compartilhada enquanto estabelece a memória compartilhada. A memória compartilhada POSIX nem sempre impõe desembolsos de cópia, em contraste com outras estruturas 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 focam no conceito UNIX de que o objeto deve ser um documento ao realizar atividades de entrada / saída em uma entidade. Portanto, porque você recita e inscreve em uma entidade de memória POSIX mútua, esta última deve ser considerada como um documento. Um documento mapeado na memória é uma entidade de memória compartilhada POSIX. Para usar o shm_open função de chamada do sistema abaixo / dev / shm, documentos separados de memória compartilhada são gerados. Existem apenas duas chamadas de sistema de memória compartilhada dedicadas de POSIX, shm_open, e shm_unlink, que estão intimamente relacionados à abertura e desvinculação de chamadas do sistema de arquivos. O ftruncate, mmap, e munmap chamadas de estrutura para documentos são usadas para realizar outras tarefas na memória compartilhada POSIX. É necessário conectar um programa que usa chamadas de memória compartilhada POSIX para -lrt.

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

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

Com ftruncate (), o tamanho do objeto será fixo.

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

Ler / escrever na memória compartilhada.

Através da munmap (), desmarcar a memória compartilhada.

Usar perto() 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 está 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 compartilhada. É uma string terminada em nulo do /nome tipo, com a estipulação de que nenhum outro caractere pode ser uma barra diferente do primeiro caractere. Oflag é um pequeno véu criado com várias das bandeiras anteriores por OR-ing, seja via O_RDONLY ou O_RDWR. Os parâmetros descritos indicam que seu objeto de memória compartilhada deve ser formado (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 de 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 documento inteiro para o objeto de memória compartilhada é retornado por meio de uma chamada efetiva para shm_open (). Conforme definido abaixo do shm_open (), o nome do parâmetro é o título da entidade de memória compartilhada. A seguir está a definição do shm_unlink () função:

>> Int shm_unlink (const char * name);

ftruncate ()

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

>> Int ftruncate (int fd, comprimento off_t);

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 ftruncar. Ftruncar rende zero na execução. Ftruncar produz -1 em caso de falha e errno está configurado para acionar o erro.

mmap ()

Eventualmente, um documento mapeado em memória com a entidade de memória compartilhada é definido por meio do mmap () método. Em seguida, ele produz um ponteiro de documento mapeado em memória que é lançado para alcançar a entidade de memória compartilhada. A seguir está a definição do mmap () função:

>> Void * mmap (void * addr, size_t length, int prot, int flags, int fd, off_t offset);

Neste, 'addr' é o endereço para o qual será mapeado. O 'comprimento' é o intervalo da entidade de memória compartilhada. Os valores para prot podem ser diferentes, mas usaremos o PROT READ | PROT WRITE. Existem vários sinalizadores, mas o MAPA PARTILHADO é essencial para a memória compartilhada. Agora, 'fd' é um descritor de documento obtido anteriormente. Offset é o ponto onde o mapeamento começa na entidade de memória compartilhada; o valor de deslocamento 0 também pode ser usado. Na conclusão, mmap () retorna o ponteiro para a posição de mapeamento da entidade de memória compartilhada.

munmap ()

Na posição direcionada por addr e obtendo tamanho, comprimento, munmap remove o mapeamento do item de memória compartilhada. Munmap retorna 0 após a conclusão e -1 na situação de imprecisão, caso em que errno é atribuído para acionar o erro.

>> Void munmap (void * addr, size_t length);

Exemplo: remetente e receptor

Tomemos o exemplo do remetente e do destinatário. O remetente criará um novo objeto de memória compartilhada com o nome / shmem-example e inscrever três numerais na memória compartilhada por meio 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.

protocolo $ touch.h
$ touch sender.c
receptor $ touch.c

Em seguida, adicionaremos o código-fonte abaixo ao protocolo dos arquivos.h, "remetente.c, 'e' receptor.c.'Agora, vamos salvar todos e fechá-los.

Agora iremos compilar e juntar o código acima usando a palavra-chave -lrt separadamente para o remetente.ce receptor.arquivo c. Aqui está o comando para fazer isso:

$ gcc -o sender sender.c-lrt
receptor $ gcc -o.c-lrt

Agora, vamos executar o código do remetente usando o seguinte comando. A saída é fornecida abaixo.

$ ./remetente

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

$ ls -l / dev / shm | grep shmem-example

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-example será desanexado. Neste caso, você não obterá nenhum objeto na saída, conforme mostrado abaixo.

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

Conclusão

Neste artigo, você aprendeu como usar a memória compartilhada POSIX com programação C no Ubuntu 20.04, incluindo cada chamada de função usada para estabelecer memória compartilhada. Espero que este artigo tenha ajudado você a melhorar seus conhecimentos de programação e coberto todas as dúvidas que você tem sobre este assunto.

Como aumentar o FPS no Linux?
FPS significa Quadros por segundo. A tarefa do FPS é medir a taxa de quadros em reproduções de vídeo ou desempenho de jogos. Em palavras simples, o nú...
Top jogos do Oculus App Lab
Se você é proprietário de um fone de ouvido Oculus, deve estar informado sobre o carregamento lateral. Sideload é o processo de instalação de conteúdo...
Os 10 melhores jogos para jogar no Ubuntu
A plataforma Windows tem sido uma das plataformas dominantes para jogos devido à grande porcentagem de jogos que estão sendo desenvolvidos hoje para o...