Programação C

Como usar a função mmap em linguagem C?

Como usar a função mmap em linguagem C?
O mmap () função é usada para mapear entre um espaço de endereço de processo e arquivos ou dispositivos. Quando um arquivo é mapeado para um espaço de endereço de processo, o arquivo pode ser acessado como uma matriz no programa. Esta é uma das maneiras mais eficientes de acessar dados no arquivo e fornece uma interface de codificação contínua 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 (void * endereço, size_t comprimento, int proteger, int sinalizadores, int filedes,
off_t offset)

Argumentos:

A função leva 6 argumentos:

1. Morada:

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 este argumento for NULL, o kernel pode colocar o mapeamento em qualquer lugar que achar adequado.

2. comprimento:

Este é o número de bytes que devem ser mapeados.

3. proteger:

Este argumento é usado para controlar que tipo de acesso é permitido. Este argumento pode ser 'OR' lógico dos seguintes sinalizadores PROT_READ | PROT_WRITE | PROT_EXEC | PROT_NONE.  Os tipos de acesso de leitura, gravação e execução são as permissões sobre o conteúdo.

4. bandeiras:

Este argumento é usado para controlar a natureza do mapa. A seguir estão alguns valores comuns dos sinalizadores:

  • MAP_SHARED: Este sinalizador é usado para compartilhar o mapeamento com todos os outros processos, que são mapeados para este objeto. As alterações feitas na região de mapeamento serão gravadas de volta no arquivo.
  • MAP_PRIVATE: Quando este sinalizador é usado, 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: Este sinalizador é usado para criar um mapeamento anônimo. Mapeamento anônimo significa que o mapeamento não está conectado a nenhum arquivo. Este mapeamento é usado como a primitiva básica para estender o heap.
  • MAP_FIXED: Quando este sinalizador é usado, o sistema deve ser forçado a usar o endereço de mapeamento exato especificado no Morada Se isso não for possível, o mapeamento falhará.

5. filedes:

Este é o descritor de arquivo que deve ser mapeado.

6. Deslocamento:

Este é o deslocamento de onde o mapeamento do arquivo começou. Em termos simples, o mapeamento se conecta a (Deslocamento) para (deslocamento + comprimento-1) bytes para o arquivo aberto em filedes descritor.

Valores de retorno:

Com sucesso, o mmap () retorna 0; para falha, a função retorna MAP_FAILED.

De forma pictórica, podemos representar a função do mapa da seguinte forma:

Para remover o mapeamento da região mapeada munmap () função é usada:

Sintaxe:

int munmap(vazio *Morada, size_t comprimento);

Valores de retorno:

Com 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 a chamada de sistema mmap ():

  • Alocação de memória (Exemplo 1.c)
  • Lendo arquivo (Exemplo 2.c)
  • Gravando arquivo (Exemplo 3.c)
  • Comunicação entre processos (Exemplo 4.c)

Exemplo 1.c

#incluir
#incluir
int main ()
int N = 5; // Número de elementos do array
int * ptr = mmap (NULL, N * sizeof (int),
PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS,
0, 0);
if (ptr == MAP_FAILED)
printf ("Falha no mapeamento \ n");
return 1;

// Preencher os elementos do array
para (int i = 0; i ");
para (int i = 0; iprintf ("[% d]", ptr [i]);

printf ("\ n");
int err = munmap (ptr, 10 * sizeof (int));
se (errar != 0)
printf ("Falha ao remover mapeamento \ n");
return 1;

return 0;

No Exemplo 1.c alocamos memória usando mmap. Aqui usamos PROT_READ | PROT_WRITE proteção para leitura e gravação na região mapeada. Usamos o MAP_PRIVATE | MAP_ANONYMOUS bandeira. MAP_PRIVATE é usado porque a região de mapeamento não é compartilhada com outros processos, e MAP_ANONYMOUS é usado porque aqui, não mapeamos nenhum arquivo. Pelo mesmo motivo, o descritor de arquivo e a Deslocamento o valor é definido como 0.

Exemplo 2.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 = abrir (caminho do arquivo, O_RDONLY);
if (fd < 0)
printf ("\ n \"% s \ ""não pôde abrir \ n"",
caminho de arquivo)
Como desenvolver um jogo no Linux
Uma década atrás, poucos usuários de Linux preveriam que seu sistema operacional favorito um dia seria uma plataforma de jogos popular para videogames...
Portas de código aberto para motores de jogos comerciais
Recriações gratuitas, de código aberto e de mecanismo de jogo de plataforma cruzada podem ser usadas para jogar jogos antigos, bem como alguns dos tít...
Melhores jogos de linha de comando para Linux
A linha de comando não é apenas sua maior aliada ao usar o Linux - ela também pode ser uma fonte de entretenimento porque você pode usá-la para jogar ...