Limpeza de recursos na finalização anormal do processo

Minha pergunta é, quando um processo termina anormalmente (através de um sinal, pode ser SIGKILL então não podemos interceptá-lo), existe alguma ordem garantida ou atomicidade em que seus recursos são liberados? Em particular, eu estou interessado em bloqueios de arquivos e memória compartilhada.

Por exemplo:

1) Se o processo está segurando bloqueios em 2 arquivos e termina anormalmente, é possível que outro processo que tenta bloquear os mesmos arquivos veja um arquivo sendo bloqueado e outro sendo desbloqueado? Ou o processo de liberação do arquivo é atômico do ponto de vista de outros processos?

Se não for atômico, há pelo menos uma ordem predefinida na qual os bloqueios de arquivo seriam liberados pelo processo de terminação (por exemplo, na ordem inversa da qual eles foram bloqueados inicialmente)?

2) Eu queria usar um bloqueio de arquivo para garantir a inicialização adequada da memória compartilhada - os processos mapeados na memória compartilhada armazenariam um bloqueio compartilhado e um novo processo que deseja mapear no mesmo segmento de memória compartilhada tentaria testar esse bloqueio para ver se a inicialização precisa ser executada (posso fornecer mais detalhes mais tarde, se necessário).

No entanto, a mesma questão surge: se um processo que mantém um bloqueio de arquivo e também mapeado para o segmento de memória compartilhada é anormal, é possível que após a memória compartilhada ser automaticamente desmapeada, outros processos ainda veriam o bloqueio de arquivo como bloqueado? Ou o desmapeamento do segmento de memória compartilhada e o desbloqueio de um arquivo atômico do ponto de vista de outros processos?

questionAnswers(2)

yourAnswerToTheQuestion