Nettoyage des ressources en cas de terminaison de processus anormal

Ma question est la suivante: lorsqu’un processus se termine anormalement (via un signal, cela pourrait être SIGKILL pour que nous ne puissions pas l’intercepter), y a-t-il un ordre ou une atomicité garantis dans lequel ses ressources sont libérées? En particulier, je suis intéressé par les verrous de fichiers et la mémoire partagée.

Par exemple:

1) Si le processus contient deux fichiers et s’arrête anormalement, est-il possible qu’un autre processus essayant de verrouiller les mêmes fichiers voit un fichier verrouillé et un autre déverrouillé? Ou le processus de libération du fichier verrouille-t-il atomique du sharepoint vue des autres processus?

S’il n’est pas atomique, y a-t-il au moins un ordre prédéfini dans lequel les verrous de fichiers seraient libérés par le processus de terminaison (par exemple dans l’ordre inverse de leur locking initial)?

2) Je voulais utiliser un verrou de fichier pour assurer une initialisation correcte de la mémoire partagée – les processus mappés dans la mémoire partagée contiendraient un verrou partagé, et un nouveau processus qui souhaite mapper dans le même segment de mémoire partagée essaierait de vérifier si l’initialisation doit être effectuée (je peux donner plus de détails ultérieurement si nécessaire).

Cependant, la même question se pose ici: si un processus contenant un verrou de fichier et mappé dans un segment de mémoire partagée se termine de manière anormale, est-il possible qu’un autre processus considère le locking du fichier comme verrouillé? Ou est le démappage du segment de mémoire partagée et déverrouiller un fichier atomique du sharepoint vue des autres processus?

Comme impliquée par votre question, cela dépend du signal d’arrêt envoyé au programme. AFIK, ce n’est vraiment que KILL (c’est-à-dire kill -kill ) mettra fin à un processus sans donner au processus l’occasion de se fermer correctement. D’autres signaux comme TERM ou SIGINT peuvent être capturés par le programme lui-même et ignorés, ou utilisés pour lancer un processus d’arrêt propre. Je suppose que les signaux les plus légers comme SIGHUP ne feront rien à moins que le code ne comporte des crochets explicites programmés. Donc, je ne connais pas la réponse spécifique à votre question sur les verrous de fichiers, mais considérez le fait que cela ne kill -kill que kill -kill qui vous préoccupe ici.

Non, il n’y a pas d’ordre dans la libération des ressources. C’est sûr, les verrous sont libérés une fois le processus terminé.

Si je comprends bien votre question, vous avez deux ou plusieurs «verrous» qui sont liés les uns aux autres. D’une manière ou d’une autre, votre application dépend de l’ordre de sortie exact des verrous. Sans connaître beaucoup de détails sur votre problème, cela semble être une mauvaise conception .

Si le verrou du fichier dépend du verrou de la mémoire partagée, vous devez implémenter cette dépendance par programme.

Une autre solution consiste à attendre 100 millisecondes, en vérifiant le deuxième verrou. Comme vous pouvez supposer, tous les verrous du processus terminé seront libérés dans un court laps de temps. Si votre application nouvellement démarrée peut acquérir le premier verrou, il faudra d’abord attendre 100 millisecondes avant d’essayer d’acquérir le verrou de fichier (autrement dit). Cela évite automatiquement toute condition de concurrence si un processus était terminé à ce stade.