Bonjour,
(Les 2 applications sont développées en C sous linux.)
Je suis confronté à un problème et je ne vois pas comment le résoudre. J'ai 2 applications distinctes (A et B) dont une que je n'ai pas écrite (A). J'ai besoin de faire de la synchronisation temporelle entre ces 2 applications de la facon suivante :
L'application A écrit dans un segment de mémoire partagée une image vidéo toutes les x ms , puis libère un sémaphore servant à la synchro.
L'application B a une boucle de dessin pour son interface, et dans une zone elle doit afficher en vignette l'image générée par l'application A. Pour se synchroniser à A , B se met en attente sur le sémaphore, et lorsqu'il est libéré par A, B dessine son interface, puis va lire dans le segment de mémoire partagée l'image générée par A et le dessine dans le reste de l'interface, puis B blitte à l'écran l'interface avec la vidéo.
Ceci fonctionne très bien sauf dans un cas : quand A plante brutalement. En effet, A est lancé par B via un fork, et on recoit bien l'info SIGCHILD lorsque A est bien quitté, mais pas lorsque A plante brutalement. La conséquence est que le thread de dessin de l'interface est bloqué, puisqu'en attente d'une libération de sémaphore, et B n'a absolument aucune info que A a quitté brutalement (hormis en mettant en place un chien de garde, mais ce n'est pas une bonne solution).
Sachant qu'il est indispensable de synchroniser de facon temporelle les 2 applications afin que les images soient affichées au bon cadencement (cadencement géré par A) puisqu'il s'agit d'une vidéo, je n'ai pas d'autre choix que d'utiliser un mécanisme de synchronisation temporelle à base de sémaphore pour transmettre ce cadencement vers B.
Comment faire pour que B soit informé d'un plantage brutal de A (afin de désactiver la lecture de la mémoire partagée) ?
Merci d'avance