Arquivo de cabeçalho:
#incluirSintaxe:
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; 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)