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-lrtreceptor $ 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.