O kernel sabe quais páginas são modificadas da mesma forma que qualquer outra página: quando escrito, um sinalizador nas tabelas de páginas é configurado para marcá-lo como "sujo". Isso é feito pela CPU ou pela MMU ou com a ajuda deles (por exemplo, eles podem definir o bit diretamente ou interromper uma interrupção para que o software faça isso).
Mas, na verdade, o comportamento que você está assumindo não é garantido. Páginas alteradas não precisam ser escritas de volta (ou mesmo enfileiradas para serem escritas de volta) até que msync
ou munmap
seja chamado.
Não sei quantas outras formas existem para modificar um arquivo, mas há pelo menos algumas:
-
truncate
/ftruncate
-
writev
,pwritev
,aio_write
(variantes dewrite
) - Use-o como um arquivo de troca, um dispositivo de backup para um dispositivo de loopback (por exemplo, / dev / loop0), etc.
- Pode haver
ioctl
chamadas que alteram o conteúdo do arquivo. Pior, estes podem ser específicos do sistema de arquivos.