Avertir un ensemble de process que quelquechose se passe
Le
rixed
Bonjour !
J'ai un problème de synchronisation dont je ne trouve pas de solution
simple. Voilà :
J'ai un process producteur qui, de temps en temps, modifie des fichiers.
J'ai aussi, en option, quelques process consommateurs qui font des
choses avec les fichiers produits par ce premier process. Même si celui-ci
n'est pas lancé, d'ailleurs.
J'aimerais que le producteur, lorsqu'il tourne et qu'il vient de changer
ses fichiers, avertisse les autres que quelquechose à changé et qu'ils
doivent se mettre au travail.
Actuellement, les consommateurs jettent un oeil toutes les secondes sur
les fichiers du producteur pour voir s'il y a du neuf, mais ce n'est pas
optimal
L'ennuis, c'est que tous ses process peuvent être lancés / arrétés
n'importe quand et indépendamment. Je ne trouve donc pas de solution
simple à base de signal. Je ne trouve pas non plus mon bonheur du côté
des files de messages ni des sémaphores, et l'horrible famd me fait
peur.
La seule chose que je vois c'est que chaque consommateur s'enregistre
auprès du producteur (s'il est lancé, sinon essayer régulièrement)
pour recevoir une notification, par exemple via une socket. Mais
je rève de quelquechose de plus simple, permettant au producteur de
"broadcaster" un signal quelconque à destination de consommateurs
éventuels ; genre quelquechose de similaire au netlink broadcast de
Linux.
Avez-vous des idées ?
J'ai un problème de synchronisation dont je ne trouve pas de solution
simple. Voilà :
J'ai un process producteur qui, de temps en temps, modifie des fichiers.
J'ai aussi, en option, quelques process consommateurs qui font des
choses avec les fichiers produits par ce premier process. Même si celui-ci
n'est pas lancé, d'ailleurs.
J'aimerais que le producteur, lorsqu'il tourne et qu'il vient de changer
ses fichiers, avertisse les autres que quelquechose à changé et qu'ils
doivent se mettre au travail.
Actuellement, les consommateurs jettent un oeil toutes les secondes sur
les fichiers du producteur pour voir s'il y a du neuf, mais ce n'est pas
optimal
L'ennuis, c'est que tous ses process peuvent être lancés / arrétés
n'importe quand et indépendamment. Je ne trouve donc pas de solution
simple à base de signal. Je ne trouve pas non plus mon bonheur du côté
des files de messages ni des sémaphores, et l'horrible famd me fait
peur.
La seule chose que je vois c'est que chaque consommateur s'enregistre
auprès du producteur (s'il est lancé, sinon essayer régulièrement)
pour recevoir une notification, par exemple via une socket. Mais
je rève de quelquechose de plus simple, permettant au producteur de
"broadcaster" un signal quelconque à destination de consommateurs
éventuels ; genre quelquechose de similaire au netlink broadcast de
Linux.
Avez-vous des idées ?

Poser une question


select, poll, epoll, kqueue, ... selon le cas. Le consommateur (ou un
thread du consommateur) restant en attente sur un tel "select" qui
regarde s'il y a des choses à lire sur la sortie du producteur.
Voir par exemple le "tail -f" de freebsd et notamment les fonctions
set_events() et follow() dans
http://www.freebsd.org/cgi/cvsweb.c.../forward.c
--
Michel TALON
Cela implique que le producteur ajoute au moins un octet à la fin d'un
fichier (celui qui est "selecté()" par les consommateurs) chaque fois
qu'il veut avertir ses éventuels clients... N'y a t-il pas un moyen sans
écrire dans un vrai fichier ?
Remarque, je peut toujours dire que le fichier est "vidé" par le
producteur au bout d'une taille prédéfinie connue aussi des consommateurs
(genre quelques centaines d'octets). Lorsqu'ils arrivent à la fin les
consommateurs se positionnent au début et attendent que le fichier se
fasse vider (ie. ils attendent que le read() bloque... Hum, ça m'a pas
l'air faisable ça...)
Ca n'existe pas des pipes nommés que plusieurs process peuvent lire
ensemble ? Non je suppose, il faut bien dans ce cas stoquer les
écritures quelquepart...
n'importe quoi. A la fin d'un fichier il y a toujours la fin de fichier
à lire.
Bon je vais regarder comment fait tail -f
Bon, pas de magie à l'horizon : ça sleep() oubien ça utilise une API
spécifique au kernel.
Justement, ça sleep ou ça utilise un truc genre select, etc.
--
Michel TALON