Estou tentando entender o que acontece quando um arquivo, que foi mapeado na memória pela mmap
chamada do sistema, é posteriormente gravado por outros processos.
Eu tenho mmap
ed memória com PROT_READ
proteção no "processo A". Se eu fechar o descritor de arquivo subjacente no processo A e outro processo gravar posteriormente nesse arquivo (não usando mmap
; apenas um simples redirecionamento de stdout para o arquivo usando >
no shell), a mmap
memória ed no espaço de endereço do processo A será afetada ? Dado que as páginas são somente leitura, eu esperaria que elas não mudassem. No entanto, o processo A está sendo finalizado por SIGBUS
sinais como resultado de acessos inválidos à memória ( Non-existent physical address at address 0x[...]
) ao tentar analisar a memória mapeada. Estou suspeitando que isso seja decorrente de gravações no arquivo de apoio por outros processos. A configuração MAP_PRIVATE
seria suficiente para proteger completamente essa memória de outros processos?
fechar o descritor de arquivo não muda nada
Pode ser. A página de manual do
mmap(2)
diz:Na prática, as alterações feitas por outros processos parecem refletir-se no conteúdo da região mmaped, pelo menos para arquivos regulares.
Estou esperando que isso aconteça quando você truncar um arquivo mmaped.
Não,
MAP_PRIVATE
apenas evite que modificações na memória sejam levadas para o arquivo de apoio, e não o contrário.