Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
791 connectés 

  FORUM HardWare.fr
  Programmation
  C

  synchronisation temporelle entre 2 applications distinctes

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

synchronisation temporelle entre 2 applications distinctes

n°1769059
xilebo
noone
Posté le 04-08-2008 à 16:53:37  profilanswer
 

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  :jap:

mood
Publicité
Posté le 04-08-2008 à 16:53:37  profilanswer
 

n°1769064
Un Program​meur
Posté le 04-08-2008 à 17:10:13  profilanswer
 

J'aurais jure que SIGCHILD est envoye quelle que soit la maniere dont
les enfants meurent.  Tu es sur que tu n'as pas un autre probleme?

n°1769106
tpierron
Posté le 04-08-2008 à 18:05:04  profilanswer
 

En fait si tu postionnes (dans le processus père) SIGCHLDà SIG_IGN, tu ne recevras pas le signal.
 
Une piste à explorer ?
 
Edit: tu peux remettre le comportement par défaut avec un appel du genre "signal(SIGCHLD, SIG_DFL)".

Message cité 1 fois
Message édité par tpierron le 04-08-2008 à 18:07:03
n°1769144
Taz
bisounours-codeur
Posté le 04-08-2008 à 19:15:28  profilanswer
 

Un Programmeur a écrit :

J'aurais jure que SIGCHILD est envoye quelle que soit la maniere dont
les enfants meurent.  Tu es sur que tu n'as pas un autre probleme?


les signaux de base et la latence, pas glop

n°1769262
Un Program​meur
Posté le 04-08-2008 à 22:30:13  profilanswer
 

Taz a écrit :

les signaux de base et la latence, pas glop


Tu te préoccupes beaucoup de la latence quand tu traites les cas d'erreurs comme un
process qui meurt de façon inoppinée?  Moi pas.

n°1769409
matafan
Posté le 05-08-2008 à 11:26:07  profilanswer
 

J'aurais pensé aussi que SIGCHLD est envoyé quand le fils meure. Sinon si tu peux modifier A, tu peux positioner le falg SEM_UNDO sur ton opération, de sorte qu'elle soit automatiquement défaite si ton fils meure. Autrement tu peux positioner un timeout dans le père au lieu d'attendre indéfiniment (semtimedop() au lieu de semop()).

n°1769415
xilebo
noone
Posté le 05-08-2008 à 11:46:41  profilanswer
 

Un Programmeur a écrit :

J'aurais jure que SIGCHILD est envoye quelle que soit la maniere dont
les enfants meurent.  Tu es sur que tu n'as pas un autre probleme?


Je vais regarder un peu plus en détail. Je vais d'ailleurs faire 2 applications minimalistes pour tester cela.  
 
Mon appel à wait sur l'application A est faite dans la fonction de réception du signal SIGCHLD. Or je ne recois pas ce signal, et dans la liste des processus, je constate bien que mon application A s'est terminée, mais reste dans l'état zombie.
 
 

tpierron a écrit :

En fait si tu postionnes (dans le processus père) SIGCHLDà SIG_IGN, tu ne recevras pas le signal.
 
Une piste à explorer ?
 
Edit: tu peux remettre le comportement par défaut avec un appel du genre "signal(SIGCHLD, SIG_DFL)".


Il me semble que l'application A (appelons la par son nom , il s'agit de VLC) fait un trap sur des signaux , je vais vérifier que SIGCHLD n'est pas "trappé".
 

matafan a écrit :

J'aurais pensé aussi que SIGCHLD est envoyé quand le fils meure. Sinon si tu peux modifier A, tu peux positioner le falg SEM_UNDO sur ton opération, de sorte qu'elle soit automatiquement défaite si ton fils meure. Autrement tu peux positioner un timeout dans le père au lieu d'attendre indéfiniment (semtimedop() au lieu de semop()).


Je ne savais pas que l'on pouvait faire un appel conditionné sur un sémaphore. Merci de l'info, je pense que je vais exploiter aussi cette piste (en plus de corriger le probleme avec SIGCHLD).

n°1769458
Un Program​meur
Posté le 05-08-2008 à 13:14:06  profilanswer
 

matafan a écrit :

J'aurais pensé aussi que SIGCHLD est envoyé quand le fils meure. Sinon si tu peux modifier A, tu peux positioner le falg SEM_UNDO sur ton opération, de sorte qu'elle soit automatiquement défaite si ton fils meure. Autrement tu peux positioner un timeout dans le père au lieu d'attendre indéfiniment (semtimedop() au lieu de semop()).


 
Ca me ferait peur a priori ce SEM_UNDO ici.  Quand c'est un lecteur qui l'utilise, ca va.  Quand c'est
celui qui modifie les donnees, on peut se retrouver avec des donnees inconsistantes et pas d'avertissement.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  synchronisation temporelle entre 2 applications distinctes

 

Sujets relatifs
Synchronisation de 2 JTedtPaneVBA Excel - selection de valeurs distinctes
Execution Silencieuse d'un Script d'installation d'applications autoSynchronisation MySQL local à public ?
Synchronisation avec Exchangesynchronisation ajax sous Firefox
Récupérer l'heure de la dernière synchronisation NTPsynchronisation agenda avec PDA
applications sous vista quii marchent passynchronisation mysql
Plus de sujets relatifs à : synchronisation temporelle entre 2 applications distinctes


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR