Donc, en faisant des recherches, j'ai découvert que les sémaphores System V ont un indicateur appelé SEM_UNDO qui peut inverser l'état de verrouillage lorsque le programme échoue, mais ce n'est pas garanti de fonctionner.
SEM_UNDO déverrouillerait le sémaphore en cas de plantage du processus. Si les processus se sont écrasés en raison de la corruption de la mémoire partagée, les sémaphores ne peuvent rien faire pour vous. Le système d'exploitation ne peut pas annuler l'état de la mémoire partagée.
Si vous devez pouvoir restaurer l'état de la mémoire partagée, vous devez implémenter quelque chose par vous-même. J'ai vu au moins deux modèles qui traitent de cela.
Le premier modèle avant de modifier quoi que ce soit dans la mémoire partagée prenait un instantané de la structure, en l'enregistrant dans une liste dans la mémoire partagée. Si un autre processus était capable d'obtenir le verrou et que la liste n'était pas vide, il annulait tout ce que le processus planté avait pu changer.
Le deuxième modèle consiste à faire des copies des structures shm dans la mémoire locale et à garder le verrou verrouillé pour toute la transaction. Lorsque la transaction est validée, avant de libérer le verrou, copiez simplement les structures de la mémoire locale dans la mémoire partagée. La probabilité que l'application plante pendant la copie est plus faible et l'intervention de signaux externes peut être bloquée en utilisant sigprocmask()
. (Le verrouillage dans le cas vaut mieux être bien partitionné sur les données. Par exemple, j'ai vu des tests avec un ensemble de 1000 verrous pour 10 millions d'enregistrements dans shm accessibles par 4 processus simultanés.)
Il n'y a que peu de choses qui sont garanties d'être nettoyées en cas d'échec d'un programme. La seule chose qui me vient à l'esprit ici est le nombre de liens. Un descripteur de fichier ouvert augmente le nombre de liens de l'inode sous-jacent et une fermeture correspondante le diminue, y compris une fermeture forcée lorsque le programme échoue.
Ainsi, vos processus pourraient tous ouvrir un fichier commun (ne vous souvenez pas si cela fonctionne pour les segments de mémoire partagée) et vous pourriez déclencher une sorte d'alarme si le nombre diminue, alors qu'il ne devrait pas. Par exemple, au lieu de faire une simple attente, vos processus pourraient faire une attente temporisée (pendant une seconde, par exemple) dans une boucle et interroger le nombre de liens pour être alerté lorsque quelque chose ne va pas.