Como usar a função MMAP na linguagem C?

Como usar a função MMAP na linguagem C?
O mmap () A função é usada para mapear entre um espaço de endereço do processo e arquivos ou dispositivos. Quando um arquivo é mapeado para um espaço de endereço do processo, o arquivo pode ser acessado como uma matriz no programa. Essa é uma das maneiras mais eficientes de acessar dados no arquivo e fornece uma interface de codificação perfeita que é natural para uma estrutura de dados que pode ser avaliada sem a abstração de leitura e gravação de arquivos. Neste artigo, vamos discutir como usar o mmap () função no Linux. Então vamos começar.

Arquivo de cabeçalho:

#incluir

Sintaxe:

void * mmap (endereço void *, tamanho_t, int proteger, int sinalizadores, int arquivados,
off_t offset)

Argumentos:

A função leva 6 argumentos:

endereço:

Este argumento fornece um endereço inicial preferido para o mapeamento. Se outro mapeamento não existir lá, o kernel escolherá um limite de página próximo e criará o mapeamento; Caso contrário, o kernel escolhe um novo endereço. Se esse argumento for nulo, o kernel pode colocar o mapeamento em qualquer lugar que ache.

comprimento:

Este é o número de bytes que são mapeados.

proteger:

Este argumento é usado para controlar que tipo de acesso é permitido. Este argumento pode ser lógico 'ou' das seguintes bandeiras Prot_read | Prot_write | Prot_exec | Prot_none. Os tipos de acesso de leitura, gravação e execução são as permissões no conteúdo.

bandeiras:

Este argumento é usado para controlar a natureza do mapa. A seguir, alguns valores comuns das bandeiras:

  • Map_shared: Esta bandeira é usada para compartilhar o mapeamento com todos os outros processos, que são mapeados para este objeto. Alterações feitas na região de mapeamento serão escritas de volta ao arquivo.
  • Map_private: Quando essa bandeira é usada, o mapeamento não será visto por nenhum outro processo, e as alterações feitas não serão gravadas no arquivo.
  • Map_anonymous / map_anon: Esta bandeira é usada para criar um mapeamento anônimo. Mapeamento anônimo significa que o mapeamento não está conectado a nenhum arquivo. Este mapeamento é usado como o primitivo básico para estender a pilha.
  • Map_fixed: Quando essa bandeira é usada, o sistema deve ser forçado a usar o endereço de mapeamento exato especificado no endereço Se isso não for possível, o mapeamento será falhado.

arquivado:

Este é o descritor de arquivo que deve ser mapeado.

desvio:

Isso é compensado de onde o mapeamento de arquivos começou. Em termos simples, o mapeamento se conecta a (desvio) para (deslocamento+comprimento-1) bytes para o arquivo aberto em arquivado descritor.

Valores de retorno:

No sucesso, o mmap () retorna 0; Para falha, a função retorna map_failed.

Pictorialmente, podemos representar a função do mapa da seguinte maneira:

Para unmap a região mapeada Munmap () função é usada:

Sintaxe:

int munmap(vazio *endereço, size_t comprimento);

Valores de retorno:

No sucesso, o Munmap () retorna 0; Para falha, a função retorna -1.

Exemplos:

Agora veremos um programa de exemplo para cada um dos seguintes usando o sistema MMAP () System:

  • Alocação de memória (exemplo1.c)
  • Arquivo de leitura (exemplo2.c)
  • Escrevendo o arquivo (exemplo3.c)
  • Comunicação Interprocessante (Exemplo4.c)

Exemplo 1.c

#incluir
#incluir
int main ()
int n = 5;
int *ptr = mmap (null, n *sizeof (int),
Prot_read | Prot_write, map_private | Map_anonymous, 0, 0);
if (ptr == map_failed)
printf ("mapeamento falhado \ n");
retornar 1;

para (int i = 0; iptr [i] = i*10;
para (int i = 0; iprintf ("[%d]", ptr [i]);
printf ("\ n");
int err = munmap (ptr, 10*sizeof (int));
se (err != 0)
printf ("falha na falha \ n");
retornar 1;

retornar 0;

No exemplo1.c alocamos memória usando o MMAP. Aqui usamos prot_read | Proteção prot_write para leitura e escrita na região mapeada. Usamos o map_private | Map_anonymous Flag. Map_Private é usado porque a região de mapeamento não é compartilhada com outros processos, e o map_anonymous é usado porque aqui, não mapeamos nenhum arquivo. Pela mesma razão, o Descritor de arquivo e a desvio O valor está definido como 0.

Exemplo2.c

#incluir
#incluir
#incluir
#incluir
#incluir
#incluir
int main (int argc, char *argv [])
if (argc < 2)
printf ("Caminho do arquivo não mencionado \ n");
saída (0);

const char *filepath = argv [1];
int fd = aberto (filepath, o_rdonly);
if (fd < 0)
printf ("\ n \"%s \ ""não pôde abrir \ n"",
caminho de arquivo)